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
相关产品推荐
相关产品推荐

