如何解决将来自 NodeJS 的 FormData() 请求转发到另一个服务
我正在尝试将我的请求从我的 NodeJS 代理服务器转发到另一台服务器。我尝试转发的请求包含 FormData()
我按照 MDN docs
创建了FormData
const payload = new FormData();
payload.append('addresses',file); // <---- UPLOADED FILE
payload.append('reason','reason');
payload.append('type','type');
这就是我基本上将请求发送到我的 NodeJS 服务器的方式
fetch("localhost:3000/v1/addresses",{
method: 'PUT',body: payload
});
NodeJS 服务器位于 localhost:3000
const multer = require('multer');
const upload = multer();
app.put('/v1/addresses',upload.single('addresses'),(req,res) => {
let options = {
host: 'localhost',method: 'PUT',port: 8000,path: req.originalUrl,headers: req.headers,formData: {
reason: req.body.reason,type: req.body.type,}
};
console.log("reason",req.body.reason) // "reason"
console.log("type",req.body.type) // "type"
console.log("addresses",req.file) // FILE OBJECT
const request = http.request(options,response => {
res.writeHead(response.statusCode,response.headers);
response.pipe(res);
});
request.end();
})
上面的代码,我不确定如何将实际文件发送到其他服务。此外,我没有看到传递给服务的 reason
和 type
。
奇怪的是,我在非代理服务器的传入请求中看到了这一点
PUT /v1/addresses HTTP/1.1
Host: localhost:3000
Connection: keep-alive
Content-Length: 932
Sec-Ch-Ua: "Google Chrome";v="89","Chromium";v="89",";Not A Brand";v="99"
Sec-Ch-Ua-Mobile: ?0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_3) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/89.0.4389.90 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryt2p0AWOqJCnz95hg
Accept: */*
Origin: http://localhost:3000
sec-fetch-site: same-origin
sec-fetch-mode: cors
Sec-Fetch-Dest: empty
Referer: http://localhost:3000/blocklist
Accept-Encoding: gzip,deflate,br
Accept-Language: en-US,en;q=0.9
[object Object]
解决方法
所以经过大量的搜索和实验,这个post实际上为我提供了答案
这是帖子中的代码。
const express = require("express");
const app = express();
const bodyParser = require('body-parser');
var multer = require('multer')();
const FormData = require('form-data');
const axios = require('axios');
const fs = require('fs');
app.use(bodyParser.json());
app.post('/fileUpload',multer.single('fileFieldName'),(req,res) => {
const fileRecievedFromClient = req.file; //File Object sent in 'fileFieldName' field in multipart/form-data
console.log(req.file)
let form = new FormData();
form.append('fileFieldName',fileRecievedFromClient.buffer,fileRecievedFromClient.originalname);
axios.post('http://server2url/fileUploadToServer2',form,{
headers: {
'Content-Type': `multipart/form-data; boundary=${form._boundary}`
}
}).then((responseFromServer2) => {
res.send("SUCCESS")
}).catch((err) => {
res.send("ERROR")
})
})
const server = app.listen(3000,function () {
console.log('Server listening on port 3000');
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。