【问题标题】:Error Handling in Sails.jsSails.js 中的错误处理
【发布时间】:2014-04-09 08:08:46
【问题描述】:

我刚刚开始使用 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,可以很好地促进 connect-domain,我认为可能有一些惯用的方式来做到这一点。

我已经尝试在 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())' 有效)。但是没有调用自定义错误处理程序。不知道为什么。

【问题讨论】:

  • Sails 有一个包含 express.js 文件 init 的配置文件夹,尝试将您的连接域代码放在那里。
  • 是的,我已经将它们放入 express.js,但是自定义处理程序 .use(function(err, req, res, next) {}) 仍然没有被调用...

标签: sails.js


【解决方案1】:

如果您可以控制 FooService 代码,那么最好的选择是通过在出现错误的早期调用 FooService.request 的回调,然后使用 res.serverError 或其他响应来处理那里发生的所有错误你的控制器:

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

如果 FooService 正在使用您无法控制的包,这些包本身可能会在它们无法捕获的异步代码中引发错误(错误代码!),那么另一个不错的选择是使用 Node 的 error domains。请参阅this answer,了解某人使用域来捕获异步代码中的错误的快速包装器示例。

【讨论】:

  • 从 v0.10.0 开始(我想是的?),您可以使用 res.negotiate(error) 而不是每次都扔 500。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
相关资源
最近更新 更多