1

基本上我想要这样的语法:

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

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

有没有办法做到这一点,或者我应该坚持每隔几秒钟用setTimeout?

喜欢:

var badIdea = setTimeout(dumpFunc, 5000);

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

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

特别是我需要在任何一个期间保护

  1. 来自服务器的SIGINT/SIGKILL到( +类型事件)nodeCTRLC
  2. 用户输入不符合预期并在查找undefined或的属性时使服务器崩溃NaN

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

我不指望在断电或磁盘故障的情况下能奇迹般地支持我们,但我们需要某种优雅的终止选项,所以我全神贯注。

4

2 回答 2

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,是无法捕捉到的信号。

于 2013-10-30T22:27:42.970 回答
1

您可以使用以下代码:

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

它将使您的应用程序无法崩溃。但是,我认为这不会阻止您发出终止信号。

于 2013-10-30T22:18:05.783 回答