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

Express全局异常捕获失效,返回默认HTML错误页求助

Express全局异常捕获失效排查方案

常见错误点及解决方法

  • 错误处理中间件位置错误
    Express强制要求错误处理中间件必须是最后注册的中间件,要放在所有路由、解析类中间件(比如express.json())之后。如果你的errorHandler挂载在路由之前,Express会优先匹配路由抛出的错误,找不到对应处理逻辑就返回默认错误页。
    正确注册顺序示例:

    // index.js
    const express = require('express');
    const routes = require('./routes');
    const errorHandler = require('./errorHandler');
    
    const app = express();
    
    // 先加载普通中间件
    app.use(express.json());
    // 再挂载路由
    app.use('/flycon', routes);
    // 最后挂载错误处理中间件
    app.use(errorHandler);
    
  • 错误处理函数参数不完整
    Express的错误处理中间件必须接收4个参数:err, req, res, next,少任何一个都会被识别为普通中间件,无法触发全局异常捕获。检查你的errorHandler.js:
    正确写法示例:

    // errorHandler.js
    module.exports = (err, req, res, next) => {
      // 日志输出
      console.error('全局异常:', err.stack);
      // 自定义JSON响应
      res.status(err.statusCode || 500).json({
        code: err.code || 'SERVER_ERROR',
        msg: err.message || '服务器内部错误'
      });
    };
    
  • 路由中错误传递方式有误
    路由内抛出异常后,必须通过next(error)传递,且不能在之后调用res.send/res.json等响应方法(否则Express会认为响应已完成,跳过错误处理中间件)。路由代码示例:

    // routes.js
    const express = require('express');
    const router = express.Router();
    
    router.get('/healthy', (req, res, next) => {
      try {
        // 测试抛出异常
        throw new Error('测试全局异常捕获');
      } catch (err) {
        // 传递错误到全局处理中间件
        next(err);
      }
    });
    
    // 异步路由的错误处理
    router.get('/async-healthy', async (req, res, next) => {
      try {
        await Promise.reject(new Error('异步测试异常'));
      } catch (err) {
        next(err);
      }
      // 也可以直接用catch传递:
      // Promise.reject(new Error('异步测试异常')).catch(next);
    });
    
    module.exports = router;
    
  • 环境配置干扰
    若开启了Express开发环境默认配置,可能会强制返回带错误栈的HTML页面,但只要错误处理中间件正确注册,就会优先使用自定义响应。可以显式设置响应格式确保返回JSON:

    app.set('json spaces', 2);
    

内容的提问来源于stack exchange,提问作者José Carlos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:23:16