You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js readline模块读取txt文件时close事件过早触发问题排查

问题原因与解决办法

你的问题出在**line事件回调里调用了rl.close()**——每次读取到一行内容后,你立刻关闭了readline实例,导致程序只处理第一行就触发了close事件,完全没机会读取后续行。

修正方法很简单,把rl.close()从line事件的回调里删掉即可:

rl.on('line', function (line) {
    var longest=true;

    nLines++;
    var words=line.split(" ");
    nWords += words.length;
    wordsPerLine[nLines] = words.length;
    for(len in wordsPerLine) if(len > words.length) longest=false;
    if(longest) longestLine=nLines;
    console.log("Line: ",nLines," - ",words.length," words, "," is the longest: ",longest);
    // 移除这行手动关闭代码:rl.close();
}).on('close',function (line) {
    console.log("Counted: "+nWords+" words, longest line is number "+longestLine);
    res.write(getResponse(file, nLines,nWords, wordsPerLine,longestLine)); 
    res.end();
});

当readline读完文件所有内容后,会自动触发close事件,这时再执行统计结果输出和响应返回就正常了。

另外提个小优化:你用for(len in wordsPerLine)遍历数组的方式不太合适,in遍历的是键名,容易出现逻辑偏差。可以改成普通for循环来遍历行数字段,还能提前终止判断提升效率:

for (let i = 1; i <= nLines; i++) {
    if (wordsPerLine[i] > words.length) {
        longest = false;
        break; // 找到更长的行就停止判断
    }
}

内容的提问来源于stack exchange,提问作者Alberto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:05:19