Axios 相当于 req.pipe(request()) / 将快速请求数据管道传输到 Axios 请求中

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)

这里已经解决了类似的问题,接受的答案虽然不是很清楚,但确实回答了问题,但是,仅涵盖GETPOST 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)