【问题标题】:How do you catch all errors in SailsJS你如何捕捉 SailsJS 中的所有错误
【发布时间】:2014-06-22 07:00:25
【问题描述】:

我是 Node 和 Sails 的新手,已经为这个问题苦苦挣扎了几个星期。我需要记录(最终记录到文件或数据库)我们 Sails 应用程序中发生的所有错误。我找到了几个接近解决这个问题的答案,但似乎没有一个是 100% 有效的。我根据this question的答案设置了一些东西

使用 Sails v0.9.16 时,我在 config/500.js 文件中设置了日志记录,但使用测试代码时...

t.t;

... 在我的控制器中,Sails 只打印出“ReferenceError: t is not defined”。它永远不会去 500.js。在 Sails v0.10.0-rc5 中,相同的测试代码将到达我的自定义 500 中间件(如下所示)。

问题出在 Sails v0.10.0-rc5 中,似乎中间件路由器在访问我的自定义 400 中间件之前处理了 400 错误消息。

我们还没有承诺我们将使用哪个版本,但是让这个版本在其中一个或另一个中工作可能会让我们下定决心。

那么我如何得到所有发生的错误呢?如果我走在正确的轨道上,那么我缺少什么才能让它发挥作用?

提前致谢!

v0.9.16 的代码不多...除了在 500.js 文件中添加sails.log 之外,我认为我没有进行任何更改...

下面是 v0.10.0-rc5 的自定义中间件设置 ...

    loadMiddleware: function(app, defaultMiddleware, sails) {

    // Use the middleware in the correct order
        app.use(defaultMiddleware.startRequestTimer);
        app.use(defaultMiddleware.cookieParser);
        app.use(defaultMiddleware.session);
        app.use(defaultMiddleware.bodyParser);
        app.use(defaultMiddleware.handleBodyParserError);
        app.use(defaultMiddleware.methodOverride);
        app.use(defaultMiddleware.poweredBy);

        app.use(defaultMiddleware.router); //400s do not make it past this...
        app.use(defaultMiddleware.www);
        app.use(defaultMiddleware.favicon);

        app.use(function(req, res, next ) {
            sails.log("400 error caught in middleware - " + err.stack);         
            next();
        });

        app.use(function(err, req, res, next){
            sails.log("500 error caught in middleware - " + err.stack);
            next(err);
        });
}

【问题讨论】:

    标签: node.js sails.js


    【解决方案1】:

    在 Sails v0.10 中,您有 custom responses 来处理错误,因此您不需要像示例中那样提供自定义中间件。默认情况下,大多数错误(即那些不是由res.forbidden()res.notFound() 或其他处理程序专门触发的错误)将由位于api/responses/serverError.js 中的serverError 响应提供服务。你可以自定义它来做任何你喜欢的事情。

    如果您已将 v0.9 应用升级到 v0.10,您可能没有 api/responses 文件夹。没问题;只需在一个空目录中使用sails new whatever 生成一个新的v0.10 项目并将api/responses 文件夹从新项目复制到您的旧项目!

    【讨论】:

    • 嗨,斯科特,感谢您这么快回答!我确实有 api/rsponse 主管。我犹豫是否将错误日志记录在响应中,认为如果在原件冒泡时发生其他错误,我最终会错过它。如果这是放置日志记录的正确位置,那么一切都解决了。这在 v0.9 中可行吗?我能够进入 500.js 的唯一方法是使用 res.serverError()。
    • v0.9 没有自定义响应,因此在 v0.10 中更容易实现。在这一点上,几乎所有可以被 Sails 捕获的东西都被汇集到 res.serverError 中,因此自定义 serverError.js 应该可以满足您的需求。一个例外是渲染视图时发生的错误,但 got patched today,所以你想要 full 覆盖你可以从 Github 的 pull the latest Sails
    • 非常感谢您的时间和详尽的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 2010-12-06
    • 2021-12-06
    相关资源
    最近更新 更多