如何从Node.js中的命令行读取输入
本文翻译自How to read input from the command line in Node.js
readline内置模块
您是否正在使用Node.js中开发一个小的CLI工具,并希望能够提示用户从命令行输入输入? Node.js正是为此目的提供了readline模块。 它提供了一个接口,用于从可读流(例如process.stdin
)中一次读取一行数据。
这是一个简单的示例,提示用户输入其姓名和国籍,然后在控制台上打印这些详细信息:
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
事件。 进行一些后期提问可能会很有用:
// 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
模块。 您可以通过执行以下命令将其添加到您的项目中:
$ npm install prompt --save
如果使用yarn
作为包管理工具,可以执行如下命令添加prompt
模块:
$ yarn add prompt --dev
与readline模块相比,使用
prompt` 相对容易。 您无需显式配置可读和可写流。
让我们使用提示模块重写以上示例:
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}`);
});
处理密码
提示模块可以更轻松地安全地要求用户输入密码。 它将屏蔽输入,而不显示密码的实际字符:
const prompt = require('prompt');
// start the prompt
prompt.start();
// define properties schema
var schema = {
properties: {
name: {
pattern: /^[a-zA-Zs-]+$/,
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()
的便捷方法,可通过从命令行添加属性数据来扩展现有对象:
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);
});
现在,如果您运行上述程序,您应该会看到类似于以下内容的输出:
$ 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
可能是一个很好的选择。
- 常见Linux调优命令和工具
- 微信群之间消息自动转发简明教程(Github上免费共享有代码和教程)
- 使用CNN+ Auto-Encoder 实现无监督Sentence Embedding (代码基于Tensorflow)
- Flume日志收集系统架构详解
- 讨厌算法的程序员 | 第六章 归并排序
- 基于Spark /Tensorflow使用CNN处理NLP的尝试
- 一个优雅的框架 | Pytorch 初体验
- ffmpeg的时基
- FFmpeg菜鸡互啄#第7篇#文件/rtsp推流到rtmp
- H.264格式分析
- JS高级-数据结构的封装
- JS数组去重的三种方法
- 秒懂JS对象、构造器函数和原型对象之间的关系
- nginx rtmp server搭建
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 数学--数论--HDU6919 Senior PanⅡ【2017多校第九场】
- 数学--数论--Alice and Bob (CodeForces - 346A )推导
- ACM-ICPC 2019 山东省省赛 M Sekiro
- 数学--数论--HDU2136 Largest prime factor 线性筛法变形
- ACM-ICPC 2019 山东省省赛 C Wandering Robot
- 数据库SQL语言从入门到精通--Part 2--MySQL安装
- ACM-ICPC 2019 山东省省赛 A Calandar
- POJ 1845-Sumdiv(厉害了这个题)
- 数据库SQL语言从入门到精通--Part 1--SQL语言概述
- DP背包(一)
- 程序员最喜欢用的在线代码编译器,什么?你竟然不知道!可以在网页敲代码,运行调试!
- ZOJ 3623 Battle Ships
- POJ 2955 区间DP必看的括号匹配问题,经典例题
- POJ 3211 Washing Clothes
- 1745 Divisibility