如何在http-proxy-middleware中自定义代理错误响应?
自定义http-proxy-middleware代理失败时的响应内容
要自定义代理失败后的响应内容,核心是利用http-proxy-middleware提供的onError配置回调,而非ejectPlugin方法,具体实现如下:
1. 基础实现示例
以Express框架为例,在代理配置中添加onError回调,直接修改响应对象返回自定义内容:
const express = require('express'); const { createProxyMiddleware } = require('http-proxy-middleware'); const app = express(); const proxyConfig = { target: 'http://your-target-service.com', // 你的目标代理地址 changeOrigin: true, // 拦截代理错误并自定义响应 onError: (err, req, res) => { // 设置响应头 res.writeHead(503, { 'Content-Type': 'text/html; charset=utf-8' }); // 自定义HTML响应内容 res.end(` <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>代理服务异常</title> </head> <body> <h2>😥 代理请求失败</h2> <p>错误详情:${err.message}</p> <p>请稍后重试或联系管理员</p> </body> </html> `); } }; // 挂载代理中间件 app.use('/proxy-path', createProxyMiddleware(proxyConfig)); app.listen(3000, () => { console.log('服务运行在 http://localhost:3000'); });
2. 按错误类型定制响应
你可以根据错误码区分不同的失败场景,返回更精准的提示:
onError: (err, req, res) => { let errorInfo = '代理请求异常'; let statusCode = 503; // 根据错误码判断场景 switch (err.code) { case 'ECONNREFUSED': errorInfo = '目标服务未启动或拒绝连接'; statusCode = 502; break; case 'ETIMEDOUT': errorInfo = '目标服务响应超时'; break; case 'ENOTFOUND': errorInfo = '目标服务地址不存在'; statusCode = 404; break; } res.writeHead(statusCode, { 'Content-Type': 'text/plain; charset=utf-8' }); res.end(errorInfo); }
3. 关键注意事项
onError回调直接接收res响应对象,操作它即可覆盖默认错误响应,无需额外插件- 必须调用
res.end()结束响应,否则客户端请求会一直处于挂起状态 - 如果需要返回JSON格式的错误信息,只需修改
Content-Type为application/json,并传入JSON字符串:
res.writeHead(503, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ code: 503, msg: '代理服务不可用', error: err.message }));
关于ejectPlugin无效的原因
ejectPlugin的作用是移除http-proxy-middleware默认挂载的插件,而代理错误响应的处理不属于插件机制范畴,因此用它来修改错误内容是找错了方向,onError才是官方设计的错误处理入口。
内容的提问来源于stack exchange,提问作者Colin FAY
相关产品推荐
相关产品推荐

