node.js - 防止 Sails.js 处理错误

标签 node.js error-handling sails.js bootstrapping uncaught-exception

我有一个运行 Sails.js (v0.12.0) 的 Node.js(v5.6.0,npm:v3.7.1)应用程序。

当我在 app.js 中执行这段代码时:

process.on('uncaughtException', err => {
  //Do something
});
throw new Error();

它处理我的错误。

问题是,在我加载 Sails 之后,我根本无法使用此方法捕获错误。 例如,从 bootstrap.js 抛出的错误不会被上面的代码捕获,我在控制台中收到此消息:

error: Bootstrap encountered an error: (see below)
error: Error: asdf
    at Object.module.exports.bootstrap.process.on.process.on.process.on.sails.async.series.callback [as bootstrap] 
    (c:\path\to\project\config\bootstrap
    .js:41:8)
    at Sails.runBootstrap (c:\path\to\project\node_modules\sails\lib\app\private\bootstrap.js:44:25)
    at Sails.wrapper [as runBootstrap] (c:\path\to\project\node_modules\sails\node_modules\lodash\index.js:3095:19)
    at Sails.initialize (c:\path\to\project\node_modules\sails\lib\app\private\initialize.js:54:9)
    at wrapper (c:\path\to\project\node_modules\sails\node_modules\lodash\index.js:3095:19)
    at c:\path\to\project\node_modules\sails\node_modules\async\lib\async.js:713:13
    at iterate (c:\path\to\project\node_modules\sails\node_modules\async\lib\async.js:262:13)
    at c:\path\to\project\node_modules\sails\node_modules\async\lib\async.js:274:29
    at c:\path\to\project\node_modules\sails\node_modules\async\lib\async.js:44:16
    at c:\path\to\project\node_modules\sails\node_modules\async\lib\async.js:718:17
    at c:\path\to\project\node_modules\sails\node_modules\async\lib\async.js:167:37
    at module.exports (c:\path\to\project\node_modules\sails\lib\app\load.js:184:13)
    at _toString (c:\path\to\project\node_modules\sails\node_modules\async\lib\async.js:52:16)
    at c:\path\to\project\node_modules\sails\node_modules\async\lib\async.js:548:17
    at c:\path\to\project\node_modules\sails\node_modules\async\lib\async.js:542:17
    at _arrayEach (c:\path\to\project\node_modules\sails\node_modules\async\lib\async.js:85:13) [Error: asdf]

我也试过在 bootstrap.js 中移动上面的代码,但没有成功。

如何处理 Sails 项目的任何错误?

提前致谢!

最佳答案

对于谁会来这里寻找完整的代码,我发布了我的完整代码和解释,基于 @sgress454 回答:

Sails 是一个 Web Framework,它将您的代码包装到一个 web 应用程序中,因此它永远不会宕机,因此-Sails 尝试自行处理所有错误,并通过以下方式通知用户500(如果需要),并继续运行 Web 应用程序。

Sails 应用程序分为 2 个步骤:

  1. 提升之前 - 任何人都无法访问 Web 应用程序:

    如果 Sails 遇到异常,它将退出应用程序,并使用 error 参数调用提升回调。

  2. 提升后 - Web 应用程序可访问:

    如果 Sails 遇到异常,它将退出应用程序,并使用 error 参数调用提升回调。

如果 Sails 在运行 web 应用程序时出现异常(提升后),有 2 个选项:

  1. Controller 操作本身的异常:

    Sails 将捕获此错误,并用 500 响应用户。

  2. 其他地方的异常:

    Sails 不会捕获此错误,并且会抛出 uncaughtException

要处理上述所有情况,我们需要执行以下操作:

首先我们要创建一个全局函数,这样我们就可以在代码中的任何位置调用它:

ES 2015:

//app.js
global.handleErrors = err => {
    //do something
}

ES 5.1(及之前):

//app.js
global.handleErrors = function(err) {
    //do something
}

现在我们要处理所有uncaughtException的事件:

//app.js
process.on('uncaughtException', handleErrors);

我们可以添加一些其他事件,例如:

//app.js
process.on('unhandledRejection', handleErrors);
process.on('rejectionHandled', handleErrors);
process.on('SIGINT', handleErrors);

为了捕获提升过程中发生的异常,我们需要为 sails.lift 函数提供回调,如果调用回调时出现错误,我们需要调用我们创建的 handleErrors 函数:

ES 2015:

//app.js
sails.lift(rc('sails'), err => {
    if (err) {
        handleErrors(err);
    }
});

ES 5.1(及之前):

//app.js
sails.lift(rc('sails'), function(err) {
    if (err) {
        handleErrors(err);
    }
});

我们想在 Sails 捕获并响应 500 的 Controller 中处理异常:

//api/responses/serverError.js
module.exports = function serverError(data, options) {
    handleErrors(data);
    //lot of Sails things
};

通过这种方式,所有的错误最终都会被 handleErrors 函数触发,所以我们可以在那里对错误做任何我们想做的事情,例如。登录到文件,登录到日志管理工具,发送邮件给管理员等。

关于node.js - 防止 Sails.js 处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35337411/

相关文章:

php - “Warning: preg_replace() [function.preg-replace]: Compilation failed: nothing to repeat at offset 3 in…”

javascript - npm嵌套依赖,为什么不模仿gem呢?

javascript - Express.js 请求隔离

node.js - Nginx、Node、Angular - 子文件夹 API/URL 配置

node.js - 使用 NodeGit CloneOptions 克隆一个分支

node.js - 引用错误: DOMRect is not defined

php - 如何阻止php脚本将错误附加到浏览器?

java - 无法将 ArrayList 作为表打印到控制台

mongodb - 如何在 sails js 框架中执行不区分大小写的排序?

node.js - 将 node_acl 与 sails 集成的最佳方式是什么