我在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()。这不是异步函数,为什么在这种情况下它不会退出? (这是一个错误,还是误解了我的工作方式?)
答案 0 :(得分:1)
您不能在进程的exit
事件处理程序中执行异步操作,只能执行同步操作,因为一旦执行了所有exit
事件处理程序,就会退出该进程。