【发布时间】:2019-04-12 16:56:33
【问题描述】:
我需要从客户端向我的 Node.js 服务器发送一个 multipart/form-data POST(xliff 文件),然后在 Node.js 中捕获数据并将该 POST 转发到另一个 Java 服务。
我已经使用 multer 和 express-fileupload 来解析表单数据流并在 Node.js 中捕获 xliff 的缓冲区,并且都将文件内容作为缓冲区提供给我。
但是,我似乎无法在 Node 层重新创建 FormData 对象以将 POST 转发到 Java 服务。
我继续收到错误消息“连接已终止解析多部分数据”,或者 Java 服务根本没有响应。
我还尝试使用tmp 库在本地创建一个临时文件来写入缓冲区,然后尝试FormData('file', fs.createReadStream(<path>)),但这似乎对我也不起作用......虽然我'我不确定我做的是否正确。
直接在浏览器中使用完全相同的doPOST 请求可以正常工作,但是一旦我尝试在节点层捕获调用,然后将 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);
});
});
【问题讨论】:
-
您不必将文件缓冲区转换为 xml 字符串。而是直接将应用程序
files[0]作为带有标题的缓冲区数组headers['Content-Type'] = 'multipart/form-data'; -
直接传递 xliff 的缓冲区对我来说也不起作用。我也试过了。
-
发现一篇文章做同样的事情。看看medium.com/technoetics/…
-
谢谢,已经读过 :) 那篇文章还提到了在 Node 中捕获表单数据,但没有提到如何将表单数据转发到新服务,这是我的问题
-
如果
doPost可以接受流,您可以将req直接流式传输到Java 服务器,无需本地解析。