我为资源保护端点设置了代理服务器,并且正在使用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有关,但为什么它打印正确?
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;
}),