Jac*_*ers 7 node.js express axios
使用request,您可以将POST multipart/form-data请求从express转发到另一台服务器,而无需修改初始请求的主体/参数,然后将其他服务器的响应返回给express。与axios来说,这个功能似乎缺失了。
代码:标题
const request = require('request');
const axios = require('axios');
const express = require('express');
const app = express();
app.listen(3000);
const FORWARD_URL = 'https://example.com/'
Run Code Online (Sandbox Code Playgroud)
使用请求的工作示例
app.post('/test/0', (req, res) => {
req.pipe(request(FORWARD_URL)).pipe(res);
})
Run Code Online (Sandbox Code Playgroud)
尝试#1
app.post('/test/1', (req, res) => {
req.pipe(axios.post(FORWARD_URL)).pipe(res);
})
// internal/streams/readable.js:827
// dests[i].emit('unpipe', this, { hasUnpiped: false });
// ^
// TypeError: dests[i].emit is not a function
// at IncomingMessage.Readable.unpipe (internal/streams/readable.js:827:16)
// at unpipe (S:\_Work\[REDACTED]\node_modules\unpipe\index.js:47:12)
// at send (S:\_Work\[REDACTED]\node_modules\finalhandler\index.js:306:3)
// at Immediate.<anonymous> (S:\_Work\[REDACTED]\node_modules\finalhandler\index.js:133:5)
// at Immediate.<anonymous> (S:\_Work\[REDACTED]\node_modules\express\lib\router\index.js:635:15)
// at processImmediate (internal/timers.js:466:21)
Run Code Online (Sandbox Code Playgroud)
尝试#2
app.post('/test/2', (req, res) => {
req.pipe(axios({
url: FORWARD_URL,
method: 'POST',
responseType: 'stream'
})).pipe(res);
})
// SAME ERROR AS ABOVE
Run Code Online (Sandbox Code Playgroud)
尝试#3
app.post('/test/3', async (req, res) => {
const axiosRequest = await axios({
url: FORWARD_URL,
method: 'POST',
responseType: 'stream',
data: req
})
axiosRequest.data.pipe(res);
})
// server at FORWARD_URL receives improperly formatted request body, changing request content-type headers has no affect
// ------WebKitFormBoundaryc4BjPwpdR4mG7CFN
// Content-Disposition: form-data; name="field_name"
//
// field_value
// ------WebKitFormBoundaryc4BjPwpdR4mG7CFN--
Run Code Online (Sandbox Code Playgroud)
这里已经解决了类似的问题,接受的答案虽然不是很清楚,但确实回答了问题,但是,仅涵盖GET和POST application/x-www-form-urlencoded请求,这是关于POST multipart/form-data请求的。
理想情况下,我正在寻找一种与使用axios的请求示例功能相同的解决方案,这非常适合我的用例,因为它包括文件上传,因此,我想避免解析正文,而只是将其转发到下一个服务器。
上述路线的测试是通过邮递员进行的
小智 0
将 Axios 请求标头更改为从原始请求中获取的等效标头,为我解决了错误。
代码:
const axiosRequest = await axios({
url: FORWARD_URL,
method: 'POST',
responseType: 'stream',
data: req
})
Run Code Online (Sandbox Code Playgroud)
我刚刚将原始请求标头复制到新请求中
const axiosRequest = await axios({
url: FORWARD_URL,
method: 'POST',
responseType: 'stream',
data: req,
headers: {
...req.headers
}
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2867 次 |
| 最近记录: |