集中错误处理Resitify

Centralized error handling for Resitify

本文关键字:Resitify 处理 错误 集中      更新时间:2023-09-26

我在restify应用程序中设置集中错误处理时遇到了麻烦。我想捕获某些Mongo错误,例如"E11000重复密钥错误",然后将它们映射到restify ConflictError。

如果我只是让错误从路由中的Mongo调用中冒泡出来,客户端会得到一个500错误。

我想我应该捕获InternalServerError,但下面的处理程序从未被调用:

app.on('InternalServerError', function (req, res, err, cb) {
    console.log('++++++++++++++++', err);
    return cb(err);
});

我想我可以直接使用快捷方式:

app.use(function (err, req, res, next){...

但是restify处理程序似乎不接受错误参数。我找遍了所有常去的地方,却被难住了。似乎我的第一个方法应该刚刚工作。

这可能适合您。在app.js文件中设置一个bunyan日志记录器…

var bunyan = require('bunyan');
var log = new bunyan({
    name: 'my_api',
    streams: [
        {
            path: './error.log',
            level: 'warn'
        }
    ],
    serializers: {req: restify.bunyan.serializers.req},
    src: false
});
var server = restify.createServer({
    log: log
});

然后在控制器中输入....

var restify = require('restify');
try {
    Model.findAll().then(function(vals){
        res.send(vals);
        next();
    });
}
catch(e) {
    req.log.error({req_id: req.id()}, 'Error attempting find.');
    res.send(409, new restify.ConflictError("Problem executing search."));
    next();
}