基本上我想要一个语法:
app.on("event:terminate", dumpFunc);
因此,如果服务器因任何原因而停止,我可以将数据转储到磁盘。
有没有办法做到这一点,或者我应该坚持使用setTimeout
每隔几秒钟记录数据库中的所有内容?
像:
var badIdea = setTimeout(dumpFunc, 5000);
function dumpFunc(stuff){
//Do stuff
badIdea = setTimeout(dumpFunc, 5000);
}
我对这方面的任何建议持开放态度,但我需要在崩溃时变量的状态在下一次加载时保持不变。虽然我同意,但不要崩溃可能是最好的行动方式,目前这是不可避免的。
具体来说,我需要在
期间保护SIGINT
/ SIGKILL
到node
(CTRL
+ C
类型事件)undefined
或NaN
理论上我可以将整个代码库包装在try
/ catch
块中以防止后者,但有时我们会得到循环条件(我知道,我知道,测试)或其他问题并且该过程需要终止。
我不希望在断电或磁盘故障的情况下奇迹般地支持我们,但我们需要一些优雅的终止选项,所以我全都听见了。
答案 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);
});
它会让你的应用程序无法删除。但是,我认为这不会让你远离杀戮信号。