前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何从Node.js中的命令行读取输入

如何从Node.js中的命令行读取输入

作者头像
ccf19881030
发布2020-10-26 17:36:45
8.4K0
发布2020-10-26 17:36:45
举报
文章被收录于专栏:ccf19881030的博客

本文翻译自How to read input from the command line in Node.js

readline内置模块

您是否正在使用Node.js中开发一个小的CLI工具,并希望能够提示用户从命令行输入输入? Node.js正是为此目的提供了readline模块。 它提供了一个接口,用于从可读流(例如process.stdin)中一次读取一行数据。

这是一个简单的示例,提示用户输入其姓名和国籍,然后在控制台上打印这些详细信息:

代码语言:javascript
复制
const readline = require('readline');

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

// ask user for the anme input
rl.question(`What's your name? `, (name) => {

    // ask for nationality
    rl.question(`What are you from? `, (country) => {

        // log user details
        console.log(`${name} is from ${country}`);

        // close the stream
        rl.close();
    });

});

在上面的示例中,readline.createInterface()方法用于通过定义可读和可写流来创建readline的实例。

rl.question()方法显示查询(问题),并等待用户输入答案。 输入数据可用后,它将调用回调方法,并将用户输入作为第一个参数。

最后,我们在最终的回调中调用rl.close()方法以关闭readline接口。 您还可以侦听在关闭流时调用的close事件。 进行一些后期提问可能会很有用:

代码语言:javascript
复制
// listen for close event
rl.on('close', () => {
    console.log("Goodbye ?");

    // exit the process
    process.exit(0);
    
});

查看readline文档以了解有关所有可用方法和事件的更多信息。

第三方模块-prompt

readline模块是一个低级Node.js软件包,对于复杂的用例,您可能会认为它太复杂了。 如果要使用更高级别的界面来处理用户输入,只需使用Node Package Manager(NPM)中的prompt模块。 您可以通过执行以下命令将其添加到您的项目中:

代码语言:javascript
复制
$ npm install prompt --save

如果使用yarn作为包管理工具,可以执行如下命令添加prompt模块:

代码语言:javascript
复制
$ yarn add prompt --dev

readline模块相比,使用prompt` 相对容易。 您无需显式配置可读和可写流。

让我们使用提示模块重写以上示例:

代码语言:javascript
复制
const prompt = require('prompt');

// start the prompt
prompt.start();

// ask user for the input
prompt.get(['name', 'country'], (err, result) => {
    if (err) {
        throw err;
    }

    // print user details
    console.log(`${result.name} is from ${result.country}`);

});

处理密码

提示模块可以更轻松地安全地要求用户输入密码。 它将屏蔽输入,而不显示密码的实际字符:

代码语言:javascript
复制
const prompt = require('prompt');

// start the prompt
prompt.start();

// define properties schema
var schema = {
    properties: {
        name: {
            pattern: /^[a-zA-Z\s\-]+$/,
            message: 'Name must be only letters, spaces, or dashes',
            required: true
        },
        password: {
            hidden: true
        }
    }
};


// ask user for the input
prompt.get(schema, (err, result) => {
    if (err) {
        throw err;
    }

    // print user credentials
    console.log(`${result.name} / ${result.password}`);

});

注意上例中的pattern属性。 它确保在移至下一个属性输入之前,正确验证了我们从用户那里收到的name`属性输入。

向对象添加属性

提示模块提供了另一个名为addProperties()的便捷方法,可通过从命令行添加属性数据来扩展现有对象:

代码语言:javascript
复制
const prompt = require('prompt');

// start the prompt
prompt.start();

// create an object
const user = {
    name: 'John Doe',
    country: 'USA'
};

// extend `user` object
prompt.addProperties(user, ['email', 'age'], (err) => {
    if (err) {
        throw err;
    }

    // print modified object
    console.dir(user);

});

现在,如果您运行上述程序,您应该会看到类似于以下内容的输出:

代码语言:javascript
复制
$ node index.js
prompt: email:  john.doe@example.com
prompt: age:  23
{ name: 'John Doe',
  country: 'USA',
  email: 'john.doe@example.com',
  age: '23' }

如上所示,prompt是高度可定制的。 请查阅官方文档以获取更多信息。 如果您打算在Node.js中构建可靠的CLI工具,则prompt可能是一个很好的选择。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/10/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本文翻译自How to read input from the command line in Node.js
  • readline内置模块
  • 第三方模块-prompt
    • 处理密码
      • 向对象添加属性
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档