关闭NodeJS时执行操作

时间:2014-12-31 06:47:49

标签: node.js firebase

我在nodejs中有一个Firebase连接,在连接持久时将数据推送到url,当它关闭时,我想删除那些数据(想想,我推“嘿,我在这里”,当我离开时,文字消失了)

我做了一个“runnable”,展示了它的一个例子: http://web-f6176e84-c073-416f-93af-62a9a9fbfabd.runnable.com

基本上,点击“ctrl + c”并打印出“试图删除引用”但从未实际删除数据(文档说remove()等同于set(null)它基本上将数据设置为null ,因为它是null,所以整个元素都应该消失。)

然而,它并没有删除它,我没有看到数据“消失”。 (我正在使用临时Firebase网址,如果此网址停止存在,能够复制您可以访问的任何网址。)

这是我正在使用的代码。

var FB_URL = 'https://cuhiqgro1t3.firebaseio-demo.com/test_code';
var Firebase = require('firebase');
var myRootRef = new Firebase(FB_URL);
console.log("created Firebase URL");
process.stdin.resume(); //so the program will not close instantly
function delete_fb_entries() {
    return function() {
        console.log("Trying to remove reference");
        myRootRef.remove();
        process.exit();
    }
}

//do something when app is closing
process.on('exit', delete_fb_entries());

//catches ctrl+c event
process.on('SIGINT', delete_fb_entries());

//catches uncaught exceptions
process.on('uncaughtException', delete_fb_entries());

编辑:关于“为什么”的其他信息,我将我的本地IP地址输出到我的Firebase网址,因为我很懒,而且我可以随时访问的网页设置更容易显示特定的网址设备(我知道使用路由器表会更容易),我实际上也有其他用途(如果我发生进入我的网络,我可以从中选择一个特定的设备我的网页和访问我需要的数据,无论哪种方式,它的工作原理,但我只是不能让它正确删除自己,这曾经在我相信的一个时间点工作,所以我只能假设API已经改变或东西)。

编辑2:确定按照建议删除了process.exit(),并且runnable似乎删除了有问题的数据,我在我的本地数据上尝试了(并且经过一些清理和注释),它删除了数据,但是当我按下Ctrl + C时它不再退出程序.....所以,是的。

此时我需要弄清楚“process.exit()”是否必要或不必要。

编辑3:好的所以我需要使用process.exit(据我所知,Ctrl + C不再退出程序,我必须按Ctrl + Z,然后重新启动)。我尝试在之后添加它,但我意识到删除firebase元素不是同步操作,所以当我关闭它时,我尝试(下一次尝试)是使用on complete函数的on complete处理程序(所以remove(onComplete) ,然后将process.exit()添加到onComplete函数中。

所以最后它看起来像这样,似乎正在使用我的应用程序

var FB_URL = 'https://cuhiqgro1t3.firebaseio-demo.com/test_code';
var Firebase = require('firebase');
var myRootRef = new Firebase(FB_URL);
console.log("created Firebase URL");
function onComplete() {
   process.exit();
]
process.stdin.resume(); //so the program will not close instantly
function delete_fb_entries() {
    return function() {
        console.log("Trying to remove reference");
        myRootRef.remove(onComplete);
    }
}

//do something when app is closing
process.on('exit', delete_fb_entries());

//catches ctrl+c event
process.on('SIGINT', delete_fb_entries());

//catches uncaught exceptions
process.on('uncaughtException', delete_fb_entries());

编辑4:在回复下面的评论时,我尝试修改一个简单的程序如下:

function delete_fb_entries (){
   return function () {
              console.log("I should quit soon");
         }
}

process.stdin.resume(); //so the program will not close instantly

//catches ctrl+c event
process.on('SIGINT', delete_fb_entries());

我的节目从未退出。我不明白为什么节点在这种情况下不会关闭,更改为在console.log导致nodejs退出后添加process.exit()。这不是异步函数,为什么在这种情况下它不会退出? (这是一个错误,还是误解了我的工作方式?)

1 个答案:

答案 0 :(得分:1)

您不能在进程的exit事件处理程序中执行异步操作,只能执行同步操作,因为一旦执行了所有exit事件处理程序,就会退出该进程。