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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:47:38