Express + Mongoose 数据库查询时, 如何全局统一错误处理, 不用显示地单独对每次查询都做错误处理?
发布于 6 年前 作者 Kaijun 5593 次浏览 最后一次编辑是 5 年前 来自 问答

我用Express+Mongoose构建一个API Server, 在Express里我加了一个捕获错误中间件:

app.use(function (err, req, res, next) {
  res.status(404).json({message: err.message})
})

但是在使用Mongoose的时候, 每次Query结束, 我都要手动处理error, 不管Query的回调是callback(需要手动判断有没有error), 还是Promise(需要写错误处理函数), 或者是yield(需要加上try catch), 每次我都要手动把Error传到next().

有没有什么办法可以全局处理Error? 凡事Mongoose查询有Error就自动传到Express的错误处理中间件统一做处理

9 回复

异步就是需要每次回调处理错误, 可以用Promise统一处理错误的, 有错误,直接throw new Error(err_msg)

@zkaip 可以举个例子吗?

比如我执行

Model.findOne({_id: id}).then(function(doc){
	...
}, function(err){
	return next(err)
})

我现在必须显性得给出错误处理, 是交给next()下一个错误处理中间件, 我现在的困扰是, 能不能省略掉这部分代码, 在一个地方定义一个通用的错误处理方式next(err), 这样我就不用每次查询都要写一边这样的错误处理了

@Kaijun

Model.findOne({_id: id}).then(function(doc){
	...
}).catch(function(err){
	return next(err)
})

在最后加 catch 就可以了。

@Kaijun

Model.findOne({_id: id}) .then(function(doc){ if (sth) throw new Error(‘err_msg’); return Promise… }) .then(()=>{ }) .then( ()=>{ }) .catch(function(err){ return next(err) })

这样如果有错误就直接捕获, 不用每次都处理, 也可以自己自定义错误信息

用这个 express-modern https://cnodejs.org/topic/56f6260487688ffc6e356e7c

var modern = require('express-modern');
app.get('/', modern(function* ( req, res, next){
  var doc = yield model.findOne({_id: id});
  // blabla
}));

如果 yield 抛出 err, modern 会帮你传到 next

@magicdawn 好棒!

来自酷炫的 CNodeMD

koa 可以,express就算了

@magicdawn 你好 我试了下你的库 使用generator function 或者 await/async 都不能自动传到next… 具体我提了issue, 不知道哪里有问题

回到顶部