2012-02-08 2 views
9

Я работаю над проектом узла, где я хочу записать некоторую память в файл при выходе. Я полагал, что это было так просто, как:Обработка события CTRL + C в Node.js в Windows

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

Однако этот код не выполняется (на Windows), когда CTRL + C принимается. Учитывая, что это метод defacto для выхода из Node, это кажется немного проблемой.

В этот момент я попытался обработать сигнал, а не, что приводит к ошибке (на ('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 для быстрого Google и it appears узел просто не обрабатывает сигналы в Windows, а CTRL + C фактически не вызывает событие «выхода». Вышеприведенная ошибка не должна выходить из системы * Nix.

Однако выключение платформы Windows для меня не подходит, поэтому мне необходимо обходное решение. Есть ли способ обработать события «Выход» в узле, вызванные нажатием клавиши CTRL + C для завершения сценария?

ответ

11

Я использовал этот кусок кода для прослушивания ключей. Похоже, что он работает и для Windows.

Но опять же он работает только для CTRL + C как ключевой комбинации, а не что-либо еще. Конечно, вы можете привязать функцию к process.on("exit" и вызвать ее внутри блока if ниже.

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

Отличное решение. Чувствует себя немного ... грязно, но потом, часто работайте! Благодарю. – Serapth

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