我用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的错误处理中间件统一做处理
异步就是需要每次回调处理错误, 可以用Promise统一处理错误的, 有错误,直接throw new Error(err_msg)
@zkaip 可以举个例子吗?
比如我执行
Model.findOne({_id: id}).then(function(doc){
...
}, function(err){
return next(err)
})
我现在必须显性得给出错误处理, 是交给next()下一个错误处理中间件, 我现在的困扰是, 能不能省略掉这部分代码, 在一个地方定义一个通用的错误处理方式next(err), 这样我就不用每次查询都要写一边这样的错误处理了
Model.findOne({_id: id}).then(function(doc){
...
}).catch(function(err){
return next(err)
})
在最后加 catch 就可以了。
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
@Kaijun 嗯~机智如我
koa 可以,express就算了
@magicdawn 你好 我试了下你的库 使用generator function 或者 await/async 都不能自动传到next… 具体我提了issue, 不知道哪里有问题