Node/Express自定义错误处理器未触发,求解决方案
问题原因及解决方案
核心问题是错误处理中间件的位置错误:Express的错误处理中间件必须注册在所有其他中间件、路由定义的最后,否则无法捕获后续路由抛出的错误。
你的代码里把错误处理中间件放在了路由(....部分)之前,当调用next(error)时,该中间件还没进入请求处理链,自然不会被触发。
修改步骤
- 将错误处理中间件移动到所有路由、其他中间件之后,
app.listen()之前:
const express = require('express') const bodyParser = require('body-parser'); const methodOverride = require('method-override') const app = express (); const port = process.env.PORT || 3000; app.use(express.json()); app.use(cors()); // Configuring body parser middleware app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); app.use(methodOverride()); // 所有路由定义放在这里 // .... // .... // 错误处理中间件移到最后 app.use((err, req, res, next) => { console.error(err.stack) res.status(500).send('my handler') }) app.listen(port, () => { console.log(`Server running on port ${port}`) })
- 确认路由中调用
next(error)后,没有再发送响应(你的getRidesForDate函数这点是正确的,错误分支只调用next(error),不会执行response.json)。
这样修改后,当数据库查询出错调用next(error)时,错误就会被你的自定义处理器捕获,返回你设置的响应内容。
内容的提问来源于stack exchange,提问作者quilkin
相关产品推荐
相关产品推荐

