Sails.js中的错误处理

时间:2014-03-06 15:24:04

标签: sails.js

我刚刚开始使用Sails.js,这是一个了不起的框架。但我遇到了一些情况,我找不到谷歌的解决方案,所以我来到这里寻求帮助。

我有一个控制器连接到另一个远程服务,其中包含非常旧设计的API,其中包含XML响应和不一致性,将该服务包含在简单而干净的API中。所以我有一些路由器,如:

list: function(req, res) {
    params = {
        ...
    }

    FooService.request(data, function(error, response) {
        res.send(response)
    })

    process.once('uncaughtException', function(err) {
        res.send(500, '[Foo] ' + err);
    });
},

'process.once'用于异步异常,可能在FooService.request过程中引发。我知道这是不好的代码,我的问题是:如何处理这种情况更多Sails.js的方式?

在Node.js中,我们有Domainconnect-domain,它们是针对此类问题而设计的。因为Sails.js基本上是Express,它可以很好地促进连接域,我认为可能有一些惯用的方法。

我尝试在config / local.js中添加它:

module.exports = {
    ...
    express: {
        customMiddleware: function(app) {
            console.log('Custom middleware config called')

            var domain = require('connect-domain')
            app.use(domain())
            .use(function(err, req, res, next) {
                console.log('Error catched!')
                res.send(500, '[Foo] ' + err)
            })
        }
    }
};

当发生未捕获的异常时,它不会崩溃服务器并且错误500被返回到客户端('app.use(domain())'工作)。但是没有调用自定义错误处理程序。不知道为什么。

1 个答案:

答案 0 :(得分:3)

如果您控制着FooService代码,那么最好的选择是通过在错误的早期调用FooService.request的回调来处理发生的所有错误,然后使用{{1}或控制器中的其他一些响应:

res.serverError

如果FooService正在使用你无法控制的软件包,这些软件包本身可能会在异步代码中抛出错误而它们不会被捕获(代码错误!)那么另一个好的选择就是使用Node&#39 ; s error domains。有关使用域来捕获异步代码中的错误的快速包装器的示例,请参阅this answer