2014-12-31 3 views
0

У меня есть соединение Firebase в nodejs, которое подталкивает данные к URL-адресу, когда соединение остается постоянным, когда оно закрывается, я хочу удалить эти данные (думаю, я нажимаю «эй, я здесь», и когда я уезжаю, текст исчезает)Выполнение операций при закрытии NodeJS

Я сделал «работоспособной», который показывает пример этого: http://web-f6176e84-c073-416f-93af-62a9a9fbfabd.runnable.com

в основном, нажмите «Ctrl + C» и печатает «пытается удалить ссылки» но на самом деле не удаляет данные (документы говорят, что remove() эквивалентен набору (null), который в основном устанавливает данные в значение null, а поскольку он равен нулю, весь элемент должен исчезнуть.)

Однако он не удаляет его, я не вижу, чтобы данные когда-либо «исчезали». (Я использую URL-адрес Temp Firebase, вы должныдолжны иметь возможность дублировать любой URL-адрес, к которому вы можете получить доступ, если этот URL-адрес перестает существовать).

это код, который я использую.

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()); 

EDIT: Дополнительная информация, как к «почему», я нажимаю мой локальный IP-адрес, чтобы мой URL Firebase, потому что я ленивый, и это проще просто иметь установку веб-страницы, я всегда могу доступ, который будет отображаться URL-адрес определенных устройств (и я знаю, что использование таблиц маршрутизаторов будет проще), на самом деле у меня также есть другие цели для этого использования (если я , должен быть внутри моей сети, я могу просто выбрать конкретное устройство из своего веб-страницы и доступа к данным, в которых я нуждаюсь, в любом случае, это работает, но я просто не могу заставить его корректно удалять, это использовалось для работы в какой-то момент времени, я верю, поэтому я могу только предположить, что API изменился или что-то).

РЕДАКТИРОВАТЬ 2: ОК удалил process.exit(), как было предложено, и runnable, похоже, удалил данные, о которых я спрашивал, я попробовал это на своих локальных данных (и после некоторой очистки и комментирования) он удалил данные , однако, когда я нажимаю Ctrl + C, он больше не выходит из программы ..... так yay.

Мне нужно выяснить, требуется ли «process.exit()» в этот момент или нет необходимости.

Редактировать 3: Хорошо, поэтому мне нужно использовать process.exit (насколько я могу судить, Ctrl + C больше не выходит из программы, мне нужно ctrl + Z и перезагружать). Я попытался добавить его сразу после, но я понял, что удаление элемента firebase не является синхронной операцией, поэтому, когда я закрываю его, я попытался (следующая попытка) использовать обработчик для полного удаления для функции удаления (так что удалите (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()); 

EDIT 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()); 

Моя программа никогда не выходила. Я не понимаю, почему узел не закрывается в этом случае, изменяя, чтобы добавить process.exit() после того, как console.log заставляет nodejs выйти. Это не асинхронная функция, так почему она не выходит в этом случае? (Является ли это ошибка или непонимание того, как это работает на меня?)

+1

Почему 'process.exit()', процесс уже выходит –

+0

Я думаю, что в какой-то момент я был под впечатлением, что это было необходимо (возможно, это был неточный пример, или я просто неправильно понял документацию, это было несколько месяцев с тех пор, как я написал эту пьесу). Я могу попытаться удалить его. – onaclov2000

+0

ОК, поэтому я удалил process.exit() из функции и, похоже, работает в моем примере, но не в моем локальном программном обеспечении, теперь, чтобы понять, что происходит с этим. (Я могу обновить дополнительный код, так как код, который я показываю, больше не дублирует проблему, о которой я изначально приходил, чтобы спросить о) – onaclov2000

ответ

1

Вы не можете выполнять асинхронные операции в exit обработчика событий процесса, только синхронные операции, так как процесс вышел, когда все exit обработчиков событий были выполнены ,

+0

Хорошо, так происходит, потому что im запускает кусок кода асинхронов, его блокирование событие выхода, и если я не выйду вручную в этот момент, он упустил возможность и не выйдет? – onaclov2000

+0

Вы заявляете, что я не могу выполнять async-операции, но это именно то, что я делаю, и на данный момент он работает. – onaclov2000

+0

То, что я сказал, остается верным. Если вы обрабатываете, а затем поднимаете SIGINT, это не приведет к выходу из процесса, поэтому ваш запрос firebase * * начнется. Однако сценарий, содержащий только что-то вроде этого, не будет работать: 'process.on ('exit', function() {require ('http') .get ('http: //google.com',функция (res) {console .log ('saw response')})}) '. – mscdex

Смежные вопросы