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
相关产品推荐
相关产品推荐

