Javascript 读线在55行之后停止。如何从节点js中的标准输入读取输入?

Javascript 读线在55行之后停止。如何从节点js中的标准输入读取输入?,javascript,node.js,readline,Javascript,Node.js,Readline,我有一个“简单”的问题,我似乎无法解决。我只是从标准输入(终端)读取输入,然后将输入保存到变量(这里是数组),然后将其全部打印到终端。当我尝试粘贴超过55行的文本时,程序只打印出(我输入的)前55行,然后退出。我无法理解它为什么停止以及如何修复 我的代码是: let readline = require('readline'); let rl = readline.createInterface({ input: process.stdin, terminal: true })

我有一个“简单”的问题,我似乎无法解决。我只是从标准输入(终端)读取输入,然后将输入保存到变量(这里是数组),然后将其全部打印到终端。当我尝试粘贴超过55行的文本时,程序只打印出(我输入的)前55行,然后退出。我无法理解它为什么停止以及如何修复

我的代码是:

let readline = require('readline');
let rl = readline.createInterface({
    input: process.stdin,
    terminal: true
})

let inputLines = []

const pushLinesToArray = function (line) {
    inputLines.push(line)
  }

const readOneLine = function () {
    return new Promise((resolve, reject) => {
        rl.on('line', resolve)  
        }).then(rl.on('line', pushLinesToArray))
}

const start = async () => {

    // Save all input to inputLines array
    await readOneLine()

    // Print inputLines array to terminal/console
    inputLines.forEach((line) => console.log(line))
    process.exit()
}

start()
如何解决这个问题? 我还应该提到,当我将上面的函数(readOneLine)更改为下面的代码时,如果我用ctrl+C(Mac OSX)关闭程序,它就会工作。这让我觉得它没有任何与maxLineLength或内存缓冲区做。下面我唯一更改的是
close
而不是
line
第一个
rl.on

const readOneLine = function () {
    return new Promise((resolve, reject) => {
        rl.on('close', resolve)  
        }).then(rl.on('line', pushLinesToArray))
}
我还应该提到,我将在实际打印之前对输入进行一点处理。在上面的代码中,我去掉了所有这些,因为我意识到输入的读取已经有问题了。i、 我想读55行以上的文字输入。然后将文本保存到数组中(逐行)。然后执行我的其他代码(计算每个人有多少债务)。最后打印出来

示例输入如下所示:

当我复制-->将其粘贴为输入(并标记每行(1-13))时,这项工作将完成。另一方面,如果我有这样的57行(其中第nr1-56行是文本,第nr57行是空的),它就不起作用。然后,在用文本打印前55行后,我的程序退出(第56行永远不会打印)


编辑:我需要这个来处理(关于编程问题的在线站点),我只知道他们正在用上面提到的标志:-c{files}运行我的代码。我需要修改我的代码,以便它可以处理3行到100000行之间的所有不同输入。输入总是以块的形式出现(一个字符串,其中所有的行都粘贴到终端上),我需要附加侦听器或读取此输入,并对其进行处理(计算所有内容),然后再将答案打印到终端上。所以我仍然在寻找解决这个输入问题的答案

我认为您面临的问题是因为readline带有默认的4K缓冲区大小,超过该大小它将无法读取。您必须在其选项中设置maxLineLength


请参阅。

在这种情况下,承诺的用法需要更改。由于承诺在第一行读取时解析,因此
start()
中的
wait
将取消阻止,并准备处理此时已读取的行数。输入可能被削减,因为您没有足够的时间读取所有输入

要么取消承诺,要么按承诺来处理:

rl.on('line', (line) => console.log(line));
或者,使用
close
事件解析承诺,并在读取所有内容后处理所有输入

const readOneLine = function () {
    return new Promise((resolve, reject) => {
        rl.on('line', pushLinesToArray)
        rl.on('close', () => resolve(inputLines))  
    })
}
正如标准模块[1]的node.js文档中所述,
readline
在客户端读取或关闭所有可用输入时执行
close
事件

由于您还希望处理空行作为流的结束标记,这可以在
行事件中完成

const readOneLine = function () {
    return new Promise((resolve, reject) => {
        rl.on('line', (line) => {
            if (line === '') {
                resolve(inputLines);
                rl.close();
                return;
            }
            pushLinesToArray(line)
        })
        rl.on('close', () => resolve(inputLines))  
    })
}
第一个有机会运行的
resolve()
将取消阻止
wait
。如果
resolve()
在空行和Ctrl+C之后运行两次,则不会发生任何有害的情况


[1]

实际错误是什么?程序只需打印出输入的前55行,然后退出。没有错。这不应该是问题,因为我没有长长的队伍。我的测试代码的每行长度都少于50个字符。这
readline
来自node.js标准模块。但我需要将它们保存到一个变量中,以便在实际打印行之前进行更多的逻辑处理(我使用行上的信息,然后计算每个人需要支付的金额)。下面的代码就是我删除所有其他代码以提出一个更简单问题的版本。这意味着我需要异步读取并保存所有输入,然后再处理数据并将其打印出来。在最后一行的最后一个字符之后,将有一个新行(如有人按下“回车”键时)。很抱歉explanation@Zencha,另外,将
事件附加到
关闭
事件之前。@Zencha我想你是指空行。不要在close事件中解析,而是检查
事件中是否读取了空行,然后在该点解析承诺。@Zencha欢迎使用stack overflow btw。您将学习如何更好地使用它,例如在首次发布问题时提供所有重要细节。这避免了回答问题的无用尝试(就像这里的另一个答案一样)。