通过 Node.js 控制台获取用户输入

Ser*_*ket 13 javascript node.js

我刚刚开始使用 Node.js,我不知道如何获取用户输入。我正在寻找 python 函数input()或 C 函数的 JavaScript 对应版本gets。谢谢。

Jos*_*osh 56

这也可以通过 Promise 来完成。它也比使用外部 npm 模块更安全。不再需要使用回调语法。

来自@Willian 的更新答案。这适用于 async/await 语法和 ES6/ES7。

const readline = require('readline');

const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
const prompt = (query) => new Promise((resolve) => rl.question(query, resolve));

// Usage inside aync function do not need closure demo only
(async() => {
  try {
    const name = await prompt("What's your name: ");
    // Can use name for next question if needed
    const lastName = await prompt(`Hello ${name}, what's your last name?: `);
    // Can prompt multiple times
    console.log(name, lastName);
    rl.close();
  } catch (e) {
    console.error("Unable to prompt", e);
  }
})();

// When done reading prompt, exit program 
rl.on('close', () => process.exit(0));
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案。 (4认同)
  • 刚刚测试过:将 rl 声明(ine 3)放入异步函数中可以确保它超出范围,然后就不需要最后一行了。 (2认同)

Wil*_*ian 13

您可以使用readlineor prompt,所以我将引导您完成这两个示例...

readline是 Node.js 中的内置模块。你只需要运行下面的代码:

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

rl.question("What is your name ? ", function(name) {
    rl.question("Where do you live ? ", function(country) {
        console.log(`${name}, is a citizen of ${country}`);
        rl.close();
    });
});

rl.on("close", function() {
    console.log("\nBYE BYE !!!");
    process.exit(0);
});
Run Code Online (Sandbox Code Playgroud)

如果所有这些听起来很复杂,请查看prompt示例。

prompt 是 npm 上可用的模块:

运行命令npm install prompt安装包,然后复制/粘贴以下代码:

const prompt = require('prompt');

prompt.start();

prompt.get(['username', 'email'], function (err, result) {
    if (err) { return onErr(err); }
    console.log('Command-line input received:');
    console.log('  Username: ' + result.username);
    console.log('  Email: ' + result.email);
});

function onErr(err) {
    console.log(err);
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

享受!


nes*_*_pp 11

如果您想使用 ESM(import而不是require):

import * as readline from 'node:readline/promises';  // This uses the promise-based APIs
import { stdin as input, stdout as output } from 'node:process';

const rl = readline.createInterface({ input, output });

const answer = await rl.question('What do you think of Node.js? ');

console.log(`Thank you for your valuable feedback: ${answer}`);

rl.close();
Run Code Online (Sandbox Code Playgroud)

来源: https: //nodejs.org/api/readline.html#readline

请注意,这是一个新功能。从上面链接的来源来看,似乎需要 Node v17.9.1 或更高版本。

  • 请注意,截至 2023 年 1 月,[readline/promises](https://nodejs.org/api/readline.html#promises-api) API 被视为 [级别 1 - 实验性](https://nodejs.org/ api/documentation.html#stability-index) *在任何未来版本中可能会发生非向后兼容的更改或删除。不建议在生产环境中使用该功能。* (3认同)