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

如何使用await调用readline.question方法实现指定交互式输入

解决Node.js中使用await配合readline.question的问题

要让代码支持await并满足输入隐藏的要求,核心是把回调式的readline.question封装为Promise,再通过async/await实现顺序执行。以下是修改后的完整代码:

const readline = require('readline');
const { Writable } = require('stream');

// 创建可控制输出显示的自定义流
const mutableStdout = new Writable({
  write(chunk, encoding, callback) {
    if (!this.muted) {
      process.stdout.write(chunk, encoding);
    }
    callback();
  }
});

// 初始化readline交互接口
const rl = readline.createInterface({
  input: process.stdin,
  output: mutableStdout,
  terminal: true
});

// 将readline.question封装为Promise,支持await调用
const askQuestion = (prompt, muteOutput = false) => {
  return new Promise(resolve => {
    mutableStdout.muted = muteOutput;
    rl.question(prompt, answer => {
      resolve(answer);
    });
  });
};

// 主逻辑通过自执行async函数实现顺序输入
(async () => {
  try {
    // 输入Amount,不隐藏输入内容
    const amount = await askQuestion('Amount: ', false);
    console.log('\nAmount is ' + amount);

    // 输入Secret,隐藏输入内容
    const secret = await askQuestion('Secret: ', true);
    console.log('\nSecret is ' + secret);
  } finally {
    // 执行完成后关闭readline接口,避免程序挂起
    rl.close();
  }
})();

关键修改说明:

  • Promise封装:自定义askQuestion函数把rl.question的回调逻辑转为Promise,这样就能用await等待输入完成。
  • 顺序执行:通过await确保第一个输入完成后再执行第二个,避免原代码中两个输入并行导致的混乱。
  • 输出控制:在askQuestion中根据传入的参数动态设置mutableStdout.muted,满足Amount显示输入、Secret隐藏输入的要求。
  • 资源清理:用finally块保证无论输入过程是否出错,都会关闭readline接口,防止程序一直挂起。

直接运行node mycode.js即可在控制台按顺序输入Amount和Secret,输入Secret时内容会被隐藏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:37:43