使用http-proxy-middleware导致服务器崩溃的问题排查
问题分析与解决
核心问题1:Async回调导致返回Promise引发类型错误
你给responseInterceptor的回调加了async修饰,但http-proxy-middleware的responseInterceptor期望返回Buffer/ArrayBuffer/undefined,而async函数默认返回Promise对象。即便你手动调用了res.json(),当selfHandleResponse: true时,代理内部仍会尝试把你返回的Promise当作响应数据处理,最终抛出ERR_INVALID_ARG_TYPE错误。
核心问题2:PathRewrite语法错误
你的pathRewrite存在模板字符串语法错误:
return `/arg1/arg2}`;
既没正确插入变量arg1和arg2,还多了一个多余的闭合花括号,正确写法应该是:
return `/${arg1}/${arg2}`;
修正后的代码
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((responseBuffer, proxyRes, req, res) => { try { if (!responseBuffer || responseBuffer.length === 0) { throw new Error('Invalid or empty response from target server'); } const response = responseBuffer.toString('utf8'); res.json({ id: response }); // 手动结束响应,避免代理后续处理 res.end(); } catch (error) { res.status(500).json({ error: 'Failed to process response from target server' }); res.end(); } // 返回undefined,明确告知代理无需继续处理响应 return undefined; }), }, 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" } }));
额外说明
如果你的处理逻辑确实需要异步操作(比如调用其他API),可以保留async,但要确保最终返回undefined,并且手动调用res.end()结束响应:
proxyRes: responseInterceptor(async (responseBuffer, proxyRes, req, res) => { try { // 异步操作示例 const processedData = await someAsyncFunction(responseBuffer.toString('utf8')); res.json({ id: processedData }); res.end(); } catch (error) { res.status(500).json({ error: error.message }); res.end(); } return undefined; })
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

