有没有办法在终止时在快递应用程序中触发功能?

时间:2013-10-30 22:15:08

标签: javascript node.js express

基本上我想要一个语法:

app.on("event:terminate", dumpFunc);

因此,如果服务器因任何原因而停止,我可以将数据转储到磁盘。

有没有办法做到这一点,或者我应该坚持使用setTimeout每隔几秒钟记录数据库中的所有内容?

像:

var badIdea = setTimeout(dumpFunc, 5000);

function dumpFunc(stuff){
    //Do stuff
    badIdea = setTimeout(dumpFunc, 5000);
}

我对这方面的任何建议持开放态度,但我需要在崩溃时变量的状态在下一次加载时保持不变。虽然我同意,但不要崩溃可能是最好的行动方式,目前这是不可避免的。

具体来说,我需要在

期间保护
  1. 来自服务器的SIGINT / SIGKILLnodeCTRL + C类型事件)
  2. 用户输入不符合预期并在查找undefinedNaN
  3. 属性时崩溃服务器

    理论上我可以将整个代码库包装在try / catch块中以防止后者,但有时我们会得到循环条件(我知道,我知道,测试)或其他问题并且该过程需要终止。

    我不希望在断电或磁盘故障的情况下奇迹般地支持我们,但我们需要一些优雅的终止选项,所以我全都听见了。

2 个答案:

答案 0 :(得分:2)

您可以在Domain中运行整个应用程序,以便捕获错误。它类似于捕获未捕获的异常,并且在不重新启动进程(进程会泄漏资源等)方面同样糟糕。

var domain = require('domain');
var d = domain.create();
d.on('error', function(err) {
  // log the error, store it, etc
});
d.run(function() {
  var express = require('express');
  var app = express();

  // application code here

  app.listen();
});

要抓住SIGINT,您可以执行以下操作:

process.on('SIGINT', function() {
  // caught an interrupt signal
});

至于SIGKILL,这是一个无法捕获的信号。

答案 1 :(得分:1)

您可以使用以下代码:

process.on('uncaughtException', function (err) {
    console.log("Error packing", err);
});

它会让你的应用程序无法删除。但是,我认为这不会让你远离杀戮信号。