2012-02-08 16 views
9

Pracuję nad projektem węzła, w którym chcę zapisać część pamięci do pliku przy wychodzeniu. Pomyślałem, że to było tak proste, jak:Obsługa zdarzenia CTRL + C w Node.js w systemie Windows

process.on('exit', function() { 
//handle your on exit code 
console.log("Exiting, have a nice day"); 
}); 

Jednak ten kod nie jest wykonywany (w systemie Windows) po otrzymaniu CTRL + C. Biorąc pod uwagę, że jest to defacto sposób na wyjście z Node, wydaje się, że jest to problem.

W tym momencie próbował obsłużyć sygnał zamiast, który prowadzi do błędu (na ('SIGINT', ...).)

node.js:218 throw e; // process.nextTick error, or 'error' event on first tick ^Error: No such module at EventEmitter. (node.js:403:27) at Object. (C:\Users\Mike\workspace\NodeDev\src\server.js:5:9) at Module._compile (module.js:434:26) at Object..js (module.js:452:10) at Module.load (module.js:353:32) at Function._load (module.js:310:12) at Array.0 (module.js:472:10) at EventEmitter._tickCallback (node.js:209:41)

Off do szybkiego Google i it appears węzeł po prostu nie obsługuje sygnałów w systemie Windows, a CTRL + C w rzeczywistości nie powoduje zdarzenia "exit". Powyższy błąd nie powinien kończyć się w systemie * Nix.

Jednak wyłączenie platformy Windows nie jest dla mnie prawidłową opcją, więc potrzebuję obejścia. Czy istnieje sposób obsługi zdarzeń na wyjściu w węźle powodowanych przez naciśnięcie klawiszy CTRL + C w celu zakończenia działania skryptu?

Odpowiedz

11

Użyłem tego kawałka kodu do słuchania kluczy. Wydaje się działać dla CTRL + C oraz dla systemu Windows.

Ale potem znowu działa tylko dla CTRL + C jako kombinacji klawiszy, a nie cokolwiek innego. Oczywiście możesz oboje powiązać funkcję z process.on("exit" i wywołać ją wewnątrz bloku if poniżej.

var tty = require("tty"); 

process.openStdin().on("keypress", function(chunk, key) { 
    if(key && key.name === "c" && key.ctrl) { 
    console.log("bye bye"); 
    process.exit(); 
    } 
}); 

tty.setRawMode(true); 
+1

Przyjemne rozwiązanie. Czuję się trochę ... brudny, ale potem, często robią to robota! Dzięki. – Serapth

Powiązane problemy