Sails.js中的错误处理

Sails.js中的错误处理,sails.js,Sails.js,我刚刚开始使用Sails.js,它是一个非常棒的框架。但我遇到了一些情况,我无法通过谷歌找到解决方案,所以我来这里寻求帮助 我有一个控制器,可以连接到另一个远程服务,这个远程服务使用非常旧的设计API,API中充满了XML响应和不一致性,将该服务包装在简单干净的API中。所以我有一些路由器,比如: list: function(req, res) { params = { ... } FooService.request(data, function(e

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

我有一个控制器,可以连接到另一个远程服务,这个远程服务使用非常旧的设计API,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中,我们有和,它们是为此类问题而设计的。因为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())”起作用)。但未调用自定义错误处理程序。不知道为什么。

如果您控制着FooService代码,那么最好的选择是通过调用
FooService.request的回调来处理那里发生的所有错误。在出现错误时尽早请求
,然后在控制器中使用
res.serverError
或其他一些响应:

FooService.request(data, function(error, response) {
    if (error) {return res.serverError(errror);}
    res.send(response)
});

如果FooService使用的是您无法控制的包,而这些包本身可能会在异步代码中抛出错误,而它们无法捕获这些错误(错误代码!),那么另一个好的选择是使用节点的。有关某人使用域快速包装来捕获异步代码中错误的示例,请参阅。

Sails有一个带有express.js文件init的配置文件夹,请尝试将您的连接域代码放在那里。是的,我已将它们放在express.js中,但自定义处理程序。从v0.10.0开始,仍然未调用use(function(err,req,res,next){})(我想是吧?),你可以使用
res.negotiate(error)
而不是每次抛出500。