微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将来自 NodeJS 的 FormData() 请求转发到另一个服务

如何解决将来自 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();
})

上面的代码,我不确定如何将实际文件发送到其他服务。此外,我没有看到传递给服务的 reasontype

奇怪的是,我在非代理服务器的传入请求中看到了这一点

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?