【问题标题】:Centralized error handling for ResitifyResitify 的集中式错误处理
【发布时间】:2017-08-05 02:29:29
【问题描述】:

我无法在我的 restify 应用程序中设置集中式错误处理。我想捕获某些 Mongo 错误,例如“E11000 重复键错误”,然后将它们映射到 restify ConflictError。

如果我只是让错误在路由中从 Mongo 调用中冒出,客户端会收到 500 错误。

我想我应该捕获 InternalServerError,但下面的处理程序永远不会被调用:

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

我以为我可以使用 express 方法:

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

但 restify 处理程序似乎不接受错误参数。在搜索了所有常见的地方后,我被难住了。看来我的第一种方法应该奏效了。

【问题讨论】:

    标签: javascript node.js restify


    【解决方案1】:

    这可能对你有用。在你的 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();
    }
    

    【讨论】:

    • 我要避免的正是每个控制器中的样板 try...catch。你会认为我们在写java!还是谢谢。
    猜你喜欢
    • 2018-12-27
    • 2016-03-05
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2012-08-17
    • 1970-01-01
    相关资源
    最近更新 更多