如何在NodeJS中将多部分请求从一台服务器传递到另一台服务器?

时间:2018-10-24 07:55:36

标签: node.js axios multipartform-data multer

我有两个nodeJS服务器, 服务器1从客户端获取请求,并将其传递给服务器2,服务器2向服务器1返回响应,然后服务器对该客户端进行响应。 客户端上传了一个文件,该文件的传递方式必须与我收到的其他任何其他请求相同。

我使用服务器1上的 axios 将数据发送到服务器2,并使用服务器2上的 multer 将文件存储在磁盘上。

我在将请求从server1发送到server2时遇到问题,因为请求的主体不包含任何内容,并且请求是 Multipart enter image description here

我应该如何在服务器1上处理请求?

router.post('/fileUpload', (req, res) => {
    console.log(req.body);
    res.status(200).json({ msg: "Got file" });
});

3 个答案:

答案 0 :(得分:3)

您可以使用form-data模块从nodejs应用程序发送多部分/表单数据

这是您可以在Server1上实现的代码,以从客户端接收图像文件并将其发送到Server2。

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');
});

此处multer用于处理上传的文件

答案 1 :(得分:1)

 const formData = new FormData();
 formData.append('query', updateDocQuery);
 formData.append('variables', JSON.stringify(this.setUpdateDocParams() || {}));
 for (let i = 0; i < fileArr.length; i++) {
            formData.append(`file${i}`, fileArr[i])
        }

您可以将查询变量和文件附加到formData并将formData传递到正文

答案 2 :(得分:0)

@Apar Adhikari,您的解决方案绝对有效,但是我认为我们应该使用磁盘存储而不是缓冲区。因为如果我们使用缓冲区存储,那么当有许多请求时,服务器1上的RAM很快就会过载。 还有一个问题是:如果从服务器1到服务器2的请求花费很长时间,则从浏览器到服务器1的请求将超时。因此,我认为我们应该立即将多部分数据从服务器1流到服务器2,而不必将其临时存储在服务器1上(包括磁盘存储和缓冲区),或者如果可能的话,应将文件直接发送到服务器2。