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

Node.js readline读取多输入时索引取值异常求助

解决Node.js readline获取输入时的拆分异常问题

在Experis的代码测试中,服务器输入的多组测试用例(at、ordeals、abcdefghijklmnopqrstuvwxyz、abcdefghijklmabcdefghijklm、abcdABCDabcd)并未以空格分隔的整行形式传递,而是每个测试用例单独触发一次line事件。原代码尝试用line.split(' ')拆分输入,但调用line[0]时返回的是每个单词的首字母,而非第一个测试用例at。

原代码:

const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.on('line', (line) => {
    var nums = line.split(' ');
    
    console.log(nums);
});

实际输出为每个单词的首字母:

a
o
a
a
a

原因分析

服务器实际是将每个测试用例作为独立行发送,因此readline的line事件会被触发5次,每次的line值是单个测试用例(如'at')。此时调用line[0]会取到该字符串的首字符,而非整行的第一个单词。

方案1:获取第一个测试用例(直接输出at)

如果只需要第一个测试用例,使用once绑定事件,触发一次后关闭接口:

const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.once('line', (line) => {
    console.log(line); // 输出'at'
    rl.close();
});

方案2:收集所有测试用例统一处理

若需处理全部5个测试用例,先收集所有行,再在close事件中处理:

const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

const testCases = [];

rl.on('line', (line) => {
    testCases.push(line.trim());
});

rl.on('close', () => {
    console.log('第一个测试用例:', testCases[0]); // 输出'at'
    // 遍历处理所有测试用例
    testCases.forEach((item, idx) => {
        console.log(`第${idx+1}个用例:`, item);
    });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:35:25