You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 18:31:44