【问题标题】:Node.js program does not stop reading from stdinNode.js 程序不会停止从标准输入读取
【发布时间】:2015-03-29 21:53:10
【问题描述】:

我正在尝试从标准输入读取用户输入,在我的例子中,两个输入在不同的行中输入。但是,当我运行以下代码 (node program.js) 时,它允许我输入第一个值,然后我单击 enter 并输入第二个值,但是当我单击 enter 时,它不会运行其余的我的程序。我如何告诉它停止阅读并继续?

process.stdin.resume();
process.stdin.setEncoding("ascii");
var input = "";
process.stdin.on("data", function (chunk) {
    input += chunk;
});

process.stdin.on("end", function () {  
    lines = input.split("\n");
    var numVals = lines[0];
    process.stdout.write(numVals + "\n");
    var vals = lines[1];
    process.stdout.write(vals+"\n");
});

【问题讨论】:

  • 添加了process.on('SIGINT', function(){ console.log('Got SIGINT. Press Control-D to exit.'); });,现在我可以用 Ctrl+C 后跟 Ctrl+D 来停止它,但它会打印 D

标签: javascript node.js


【解决方案1】:

Readable Streams 在触发"end" 事件之前需要一个 EOT(传输结束)字符。在 bash 中,这可以使用 CTRL+D 完成。如果您想在 2 次换行后显式停止,请尝试以下操作:

process.stdin.resume();
process.stdin.setEncoding("ascii");

var input = "";

process.stdin.on("data", function (chunk) {

    input += chunk;

    var lines = input.split("\n");

    //If there have been 2 line breaks
    if (lines.length > 2) {

        //Stop reading input
        process.stdin.pause();

        //Process data
        var numVals = lines[0];
        process.stdout.write(numVals + "\n");

        var vals = lines[1];
        process.stdout.write(vals+"\n");
    }
});

不过,您正在重新发明轮子。线路输入通常使用readlineprompt 模块处理。

【讨论】:

  • 谢谢。我实际上是从api site 中提取的。我添加了 SIGINT,我可以按 Ctrl+C,然后按 Ctrl+D,然后我的脚本的其余部分就会运行。不过,我会尝试您的建议,因为上述编辑实际上出于某种原因使其打印 D。
猜你喜欢
  • 1970-01-01
  • 2017-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 2017-06-16
  • 2011-01-08
  • 2012-10-31
相关资源
最近更新 更多