在http-proxy-middleware的onProxyReq中完成异步校验后如何给客户端返回响应
问题原因
http-proxy-middleware的onProxyReq钩子为同步执行逻辑,不会等待异步操作完成就会继续执行代理转发流程:请求会提前发送到目标服务,响应头也会提前返回给客户端。等异步回调执行时再操作响应对象,就会触发Cannot set headers after they are sent to the client错误。
解决方案
将异步校验逻辑抽为独立的前置中间件,校验通过后再放行到代理中间件,校验失败直接返回错误即可,实现代码如下:
const express = require('express'); const { createProxyMiddleware } = require('http-proxy-middleware'); // 异步校验中间件 const asyncValidateMiddleware = async (req, res, next) => { // 此处替换为实际异步校验逻辑,例如查询数据库、调用远程校验接口等 await new Promise(resolve => setTimeout(resolve, 500)); const isValid = false; // 替换为实际校验结果判断 if (!isValid) { return res.status(404).send('Invalid'); } // 校验通过,放行执行后续代理逻辑 next(); } // 代理配置无需再内置校验逻辑 const options = { target: 'https://google.com', changeOrigin: true, logLevel: 'debug', }; const testProxy = createProxyMiddleware(options); const app = express(); // 先执行校验中间件,再走代理逻辑 app.use('/', asyncValidateMiddleware, testProxy); app.listen(3000);
补充说明
如果确实需要在onProxyReq钩子内处理异步逻辑,需要先主动暂停请求转发,等校验完成后再决定恢复转发或直接返回错误,该方案实现复杂度较高,优先推荐前置中间件方案。
内容的提问来源于stack exchange,提问作者campbell.rw
相关产品推荐
相关产品推荐

