从stdin读取时,无法使用CTRL D触发'end'事件

时间:2013-05-06 15:14:34

标签: node.js events stdin

在以下代码中

process.stdin.resume();
process.stdin.setEncoding('utf8');

process.stdin.on('data', function(chunk) {
  process.stdout.write('data: ' + chunk);
});

process.stdin.on('end', function() {
  process.stdout.write('end');
});

我无法使用ctrl + D触发'end'事件,而ctrl + C只是退出而不触发它。

hello
data: hello
data
data: data
foo
data: foo
^F
data: ♠
^N
data: ♫
^D
data: ♦
^D^D
data: ♦♦

5 个答案:

答案 0 :(得分:8)

我也遇到了这个问题并在此找到了答案:Github issue

  

由Windows本身提供的readline接口(例如您现在使用的接口)不支持^ D.如果您想要更多unix-y行为,请使用readline内置模块并将stdin设置为raw模式。这将使节点解释原始按键,^ D将起作用。请参阅http://nodejs.org/api/readline.html

如果您使用的是Windows,则readline界面默认不支持^ D.您需要根据链接的说明进行更改。

答案 1 :(得分:5)

我会改变这个:

process.stdin.on('end', function() {
    process.stdout.write('end');
});

对此:

process.on('SIGINT', function(){
    process.stdout.write('\n end \n');
    process.exit();
});

更多资源:process docs

答案 2 :(得分:2)

或者

  1. 使用包含测试数据的输入文件,例如input.txt
  2. 将您的input.txt插入节点

cat input.txt |节点main.js

答案 3 :(得分:1)

  

如果您是在Hackerrank代码对工具的上下文中进行操作,那么这是给您的。

该工具的工作方式是您必须在Stdin部分中输入一些输入,然后单击Run,这将使您进入stdout。

在stdin中输入的所有输入行将由代码的process.stdin.on(“ data”,function(){})部分处理,并且输入“结束”后将直接进行处理到process.stdin.on(“ end”,function(){})部分,我们可以进行处理并使用process.stdout.write(“”)在标准输出上输出结果。

process.stdin.resume();
process.stdin.setEncoding("ascii");
var input = "";
process.stdin.on("data", function (chunk) {
    // This is where we should take the inputs and make them ready.
    input += (chunk+"\n");
    // This function will stop running as soon as we are done with the input in the Stdin
});
process.stdin.on("end", function () {
    // When we reach here, we are done with inputting things according to our wish.
    // Now, we can do the processing on the input and create a result.
    process.stdout.write(input);
});

您可以通过将代码粘贴在代码窗口上方的代码中来检查流程。

答案 4 :(得分:0)

在Mac上使用IntelliJ IDEA从Hackerrank调试代码时,我也遇到了这个问题。 需要说的是,如果没有IDEA,则在终端中执行完全相同的命令-一切正常。

起初,我发现了这一点:IntelliJ IDEA: send EOF symbol to Java application-令人惊讶的是, Cmd + D 可以正常工作并发送EOF。

然后,进入IDEA设置,我发现“其他->发送EOF”,默认情况下为 Cmd + D 。将第二个快捷方式添加到该快捷方式( Ctrl + D )之后-一切都按我以前的方式工作。