如何将Node中的multipart / form-data POST请求转发给另一个服务

问题描述 投票:0回答:1

我需要从客户端向我的Node.js服务器发送multipart / form-data POST(xliff文件),然后捕获Node.js中的数据并将该POST转发给另一个Java服务。

我已经使用multerexpress-fileupload来解析表单数据流并在Node.js中捕获xliff的Buffer,并且两者都给了我带有内容作为缓冲区的文件。

但是,我似乎无法在Node层中重新创建FormData对象以将POST转发到Java服务。

我继续收到错误消息“连接终止解析多部分数据”或者只是没有响应Java服务。

我还尝试使用tmp库在本地创建一个临时文件来编写缓冲区,然后尝试FormData('file', fs.createReadStream(<path>)),但这似乎对我不起作用......虽然我不确定我是这样做的正确。

直接使用完全相同的doPOST请求从浏览器工作正常,但是一旦我尝试在Node层中捕获调用然后将POST转发到Java服务,它就不再适用于我了。

.

const multer = require('multer');
const upload = multer();

router.post('/', upload.any(), (req, res) => {
  const { headers, files } = req;

  console.log('--------------- files:', files[0]); // object with buffer, etc.

  const XMLString = files[0].buffer.toString('utf8'); // xml string of the xliff

  const formFile = new FormData();
  formFile.append('file', XMLString);

  console.log('--------------- formFile:', formFile); // FormData object with a key of _streams: [<xml string with boundaries>, [Function: bound ]]

  headers['Content-Type'] = 'multipart/form-data';
  const url = 'some/url/to/Java/service'

  doPOST(url, formFile, {}, headers)
    .catch((error) => {
      const { status, data } = error.response;
      res.status(status).send(data);
    })
    .then(({ data }) => {
      res.send(data);
    });
});
node.js post form-data
1个回答
0
投票

您可以直接将buffer传递给表单数据,但是您还需要指定filename参数。

const multer = require('multer');
const upload = multer();

router.post('/', upload.any(), (req, res) => {
  const { headers, files } = req;
  const { buffer, originalname: filename } = files[0];

  const formFile = new FormData();
  formFile.append('file', buffer, { filename });

  headers['Content-Type'] = 'multipart/form-data';
  const url = 'some/url/to/Java/service'

  doPOST(url, formFile, {}, headers)
    .catch((error) => {
      const { status, data } = error.response;
      res.status(status).send(data);
    })
    .then(({ data }) => {
      res.send(data);
    });
});
© www.soinside.com 2019 - 2024. All rights reserved.