Node.js原生readline获取用户输入异常问题求助
Node.js readline模块未等待输入直接输出拒绝信息的排查与解决
我帮你梳理下这个问题的根源,大概率是因为你在模块顶层复用了同一个readline实例导致的异常触发。
先看你的代码:const rl = readline.createInterface(...)写在模块最外层,意味着模块一被加载,这个readline实例就创建好了。如果你的程序多次调用run函数(或者模块被重复加载),这个rl会被持续复用,而第二次调用rl.question时,旧的接口可能还处于活跃状态,甚至会因为输入流的残留状态直接触发回调——此时Answer是空字符串,自然直接进入了拒绝分支。
另外你当前的代码还漏掉了readline模块的引入语句,虽然你说之前代码正常,但现在的代码里必须补上const readline = require('readline');,否则会直接抛出未定义错误。
还有个小细节:你调用rl.write后没有关闭readline接口,会导致程序一直挂着无法正常退出。
给你修改后的代码,一次性解决这些问题:
const readline = require('readline'); module.exports.run = async () => { // 每次调用run都创建新的readline接口,彻底避免旧实例干扰 const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.question("Password Required: ", function(Answer) { if(Answer !== '123') { rl.write(`Your access has been denied sorry for the inconvenience!\n`); } else { rl.write(`Access granted!\n`); } // 处理完输入后关闭接口,防止程序一直处于运行状态 rl.close(); }); // 监听close事件,确保程序能正常退出 rl.on('close', () => { process.exit(0); }); } module.exports.help = { name: "test", description: "Is a copy command " }
修改的核心点:
- 把
rl的创建移到run函数内部,每次调用都会生成独立的readline实例,从根源上避免旧实例的状态干扰。 - 补上了
readline模块的引入,这是代码运行的基础前提。 - 处理完输入后调用
rl.close(),并监听close事件确保程序能正常退出。
这样修改后,再用return require('./util/test').run();调用,就会正常等待你的输入,再根据输入内容判断输出了。
内容的提问来源于stack exchange,提问作者Washi
相关产品推荐
相关产品推荐

