Express.js路由中错误中间件不触发,如何全局分组错误处理器?
解决Express错误处理中间件分组问题
你遇到的问题根源在于:Express Router仅负责处理其路由范围内产生的错误,而像express.json()这类app层面中间件抛出的错误,不会进入Router的错误处理流程,所以挂载在Router里的错误中间件无法触发。
下面提供两种无需在index.js中逐个调用app.use()的全局分组方案:
方案1:用模块批量导出错误处理器
新建一个专门的错误处理模块(比如errorHandlers.js),把所有错误处理函数集中在这里:
// errorHandlers.js function jsonParseError(err, req, res, next) { return (err instanceof SyntaxError && err.status === 400 && 'body' in err) ? res.sendStatus(400) : next(); } // 可以添加更多错误处理器 function serverErrorHandler(err, req, res, next) { console.error(err.stack); res.status(500).send('服务器内部错误'); } module.exports = [jsonParseError, serverErrorHandler];
然后在index.js中一次性批量挂载:
const express = require('express') const app = express() const errorHandlers = require('./errorHandlers'); app.use(express.json()) app.get('/', (req, res) => res.send('ok')) // 批量挂载所有错误处理中间件 errorHandlers.forEach(handler => app.use(handler)); app.listen(3000)
方案2:用挂载函数统一注册
如果更倾向于封装逻辑,可以在错误处理模块中写一个挂载函数,把所有错误处理器注册到app实例:
// errorHandlers.js function jsonParseError(err, req, res, next) { return (err instanceof SyntaxError && err.status === 400 && 'body' in err) ? res.sendStatus(400) : next(); } function notFoundHandler(err, req, res, next) { if (err.status === 404) { res.sendStatus(404); } else { next(err); } } module.exports = function mountErrorHandlers(app) { app.use(jsonParseError); app.use(notFoundHandler); }
然后在index.js中调用该函数:
const express = require('express') const app = express() const mountErrorHandlers = require('./errorHandlers'); app.use(express.json()) app.get('/', (req, res) => res.send('ok')) // 统一挂载错误处理器 mountErrorHandlers(app); app.listen(3000)
注意事项
错误处理中间件必须放在所有路由和普通中间件之后挂载,这样才能捕获到整个请求流程中产生的所有错误。
内容的提问来源于stack exchange,提问作者pqzpkaot
相关产品推荐
相关产品推荐

