Http-proxy-middleware 导致服务器崩溃

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

我为资源保护端点设置了代理服务器,并且正在使用http-proxy-middleware。问题是,当我收到响应时,服务器崩溃并出现以下错误:

TypeError [ERR_INVALID_ARG_TYPE]:第一个参数必须是类型 字符串或 Buffer、ArrayBuffer 或 Array 的实例或 类似数组的对象。收到未定义。

这是我在 server.mjs 上的 api:

app.use('/api/someAPI', createProxyMiddleware({
    target: 'https://api.example.com',
    changeOrigin: true,
    pathRewrite: (path, req) => {
        const { arg1, arg2 } = req.query;
        return `/arg1/arg2}`;
    },
    selfHandleResponse: true,
    on: {
        proxyRes: responseInterceptor(async (responseBuffer, proxyRes, req, res) => {
            try {
                if (!responseBuffer || typeof responseBuffer !== 'object' || responseBuffer.length === 0) {
                    throw new Error('Invalid or empty response from target server');
                }
                const response = responseBuffer.toString('utf8');

                res.json({ id: response });
            } catch (error) {
                res.status(500).json({ error: 'Failed to process response from target server' });
            }
        }),
    },
    headers: {
        Accept: "application/json",
        'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_4_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5.2 Safari/605.1.15"
    }
}));

这很奇怪,因为当我尝试将 console.log 放在

const response = responseBuffer.toString('utf8');
之后时,我看到了所需的结果,但服务器崩溃了。我尝试使用 Postman,服务器使用包含所需数据的 json 进行响应,但服务器仍然崩溃。我认为它与responseBuffer有关,但为什么它打印正确?

node.js express http proxy middleware
1个回答
0
投票

responseInterceptor
修改响应,您无法从中结束响应,并且您需要以错误所述的形式之一返回修改后的响应(字符串、缓冲区等)。

因此,返回修改后的响应(基于下面的 JSON 链接配方):

    proxyRes: responseInterceptor(async (responseBuffer, proxyRes, req, res) => {
        try {
            if (!responseBuffer || typeof responseBuffer !== 'object' || responseBuffer.length === 0) {
                throw new Error('Invalid or empty response from target server');
            }
            const response = responseBuffer.toString('utf8');

            // to mutate JSON response, you'd use JSON.parse(response).. etc, see recipe example

            return JSON.stringify({ id: response });
        } catch (error) {
            res.statusCode = 500;
            return JSON.stringify({ error: 'Failed to process response from target server' });
        }

        // set some default return response
        return responseBuffer;
    }),

请参阅:响应拦截器 > 操作 JSON 响应 (application/json)

© www.soinside.com 2019 - 2024. All rights reserved.