【问题标题】:How to pass multipart request from one server to another in NodeJS?如何在 NodeJS 中将多部分请求从一台服务器传递到另一台服务器?
【发布时间】:2021-03-19 18:08:30
【问题描述】:

我有两个 nodeJS 服务器, 服务器 1 从客户端获取请求并将其传递给服务器 2,服务器 2 向服务器 1 返回响应并响应客户端。 客户端上传一个文件,它必须以与我拥有的任何其他休息请求相同的方式传递。

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

我在将请求从 server1 发送到 server2 时遇到问题,因为请求正文不包含任何内容并且请求是 Multipart

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

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

【问题讨论】:

    标签: node.js axios multipartform-data multer


    【解决方案1】:

    您可以使用form-data 模块从 nodejs 应用程序发送 multipart/form-data

    这是您可以在 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用来处理上传的文件

    【讨论】:

    【解决方案2】:
     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 传递给正文

    【讨论】:

    • 我在使用 FormData 发送res.file 时遇到问题,它发送请求但没有文件,是否有任何实际示例说明如何完成它?使用 fs.createReadStream 从 server1 上的磁盘读取文件后,我能够发送文件
    • 如果你能从磁盘读取文件,那么将该文件附加到formData
    猜你喜欢
    • 2014-02-12
    • 2018-04-12
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 2010-11-17
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多