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

Node.js使用line-by-line依赖时readline输入提示无响应问题

问题根因

你代码的问题出在readline模块的question方法是异步执行的:

  • 调用rl.question()时只会先把问题打印出来,传入的回调函数要等用户实际输入内容按下回车之后才会执行
  • 你当前的代码顺序执行时,三个rl.question触发打印后,主线程会立刻执行后面的拼接打印逻辑,此时三个变量还没被回调赋值,所以全是undefined
  • 打印完你又直接调用了rl.close()关闭了输入接口,程序直接终止,根本不会等待用户输入

修复方案

方案1:回调嵌套(最直观的适配写法)

把后续的提问逻辑和收尾操作都放在前一个提问的回调里,保证顺序执行:

var rlname;
var rlage;
var rlcolor;

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

function getUserInput() {
    rl.question("What is your name? \n", (name) => {
        rlname = name;
        rl.question("What is your age? \n", (age) => {
            rlage = age;
            rl.question("What is your favorite color? \n", (color) => {
                rlcolor = color;
                console.log("Hello " + rlname + ", you are " + rlage + " years old and your favorite color is " + rlcolor + ".");
                // 所有逻辑执行完再关闭接口
                rl.close();
            })
        })
    })
}

getUserInput();

方案2:Promise+async/await(代码结构更清晰,避免回调嵌套)

把提问逻辑封装成Promise,用同步的写法实现异步执行顺序:

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

// 封装提问为Promise
function question(query) {
    return new Promise(resolve => rl.question(query, resolve));
}

async function getUserInput() {
    const rlname = await question("What is your name? \n");
    const rlage = await question("What is your age? \n");
    const rlcolor = await question("What is your favorite color? \n");
    console.log(`Hello ${rlname}, you are ${rlage} years old and your favorite color is ${rlcolor}.`);
    rl.close();
}

getUserInput();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 16:54:04