如何从控制台发信号给node.js stdin?

我有一个简单的node.js应用程序来回显标准input。 当我在Windows控制台上以交互方式运行它时,我期望control-Z被识别为EOF信号。 但事实并非如此。 那么如何获得一个节点应用程序来把控制Z作为EOF?

// testEcho.js process.stdin.setEncoding('utf-8'); console.log("input is a TTY?:",process.stdin.isTTY); process.stdin.on('readable',function() { var vText = process.stdin.read(); if (vText != null) console.log('echo: "%s"',vText); process.stdout.write('> '); // prompt for next }); process.stdin.on('end',function() { // Works for redirected input but not triggered by ^Z on TTY console.log('end of input reached'); }); 

“`

问题是你使用process.stdin.on而不是process.on()

看到我在这里所做的修复,一切都应该是好的,花花公子:)享受!

 process.stdin.setEncoding('utf-8'); console.log("input is a TTY?:", process.stdin.isTTY); process.stdin.on('readable',function() { var vText = process.stdin.read(); if (vText != null) console.log('echo: "%s"',vText); process.stdout.write('> '); // prompt for next }); process.on('SIGINT', function () { console.log('Over and Out!'); process.exit(0); }); 

我也用'SIGINT'replace'end' ,因为这是CTRL+C捕获的信号

您可以在这里阅读有关信号事件的信息: https : //nodejs.org/api/process.html#process_signal_events

看来解决方法是使用readline 。 这是更具terminal意识,并把交互TTY CTRL-D作为EOF,同时也正确处理redirect的inputstream。 另外,面向行/意识,它方便地从inputstring中剥离换行符。

 var readline = require('readline'); process.stdin.setEncoding('utf-8'); console.log("input is a TTY?",process.stdin.isTTY); var rl = readline.createInterface({input: process.stdin, output: process.stdout}); rl.setPrompt('> '); rl.prompt(); rl.on('line' ,function(aText) { console.log('echo: "%s"',aText); rl.prompt(); }); rl.on('close',function() { console.log('input has closed'); /* ... */ });