本文翻譯自How to read input from the command line in Node.js
readline內(nèi)置模塊
您是否正在使用Node.js中開發(fā)一個(gè)小的CLI工具芬萍,并希望能夠提示用戶從命令行輸入輸入凤藏? Node.js正是為此目的提供了readline模塊项秉。 它提供了一個(gè)接口颠焦,用于從可讀流(例如process.stdin
)中一次讀取一行數(shù)據(jù)鲜侥。
這是一個(gè)簡單的示例位仁,提示用戶輸入其姓名和國籍揣钦,然后在控制臺(tái)上打印這些詳細(xì)信息:
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()
方法用于通過定義可讀和可寫流來創(chuàng)建readline的實(shí)例移层。
rl.question()
方法顯示查詢(問題)仍翰,并等待用戶輸入答案。 輸入數(shù)據(jù)可用后观话,它將調(diào)用回調(diào)方法予借,并將用戶輸入作為第一個(gè)參數(shù)。
最后频蛔,我們在最終的回調(diào)中調(diào)用rl.close()
方法以關(guān)閉readline
接口灵迫。 您還可以偵聽在關(guān)閉流時(shí)調(diào)用的close
事件。 進(jìn)行一些后期提問可能會(huì)很有用:
// listen for close event
rl.on('close', () => {
console.log("Goodbye ??");
// exit the process
process.exit(0);
});
查看readline
文檔以了解有關(guān)所有可用方法和事件的更多信息晦溪。
第三方模塊-prompt
readline
模塊是一個(gè)低級Node.js軟件包瀑粥,對于復(fù)雜的用例,您可能會(huì)認(rèn)為它太復(fù)雜了三圆。 如果要使用更高級別的界面來處理用戶輸入狞换,只需使用Node Package Manager(NPM)中的prompt
模塊避咆。 您可以通過執(zhí)行以下命令將其添加到您的項(xiàng)目中:
$ npm install prompt --save
如果使用yarn
作為包管理工具,可以執(zhí)行如下命令添加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}`);
});
處理密碼
提示模塊可以更輕松地安全地要求用戶輸入密碼割按。 它將屏蔽輸入膨报,而不顯示密碼的實(shí)際字符:
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屬性。 它確保在移至下一個(gè)屬性輸入之前适荣,正確驗(yàn)證了我們從用戶那里收到的
name`屬性輸入现柠。
向?qū)ο筇砑訉傩?/h3>
提示模塊提供了另一個(gè)名為addProperties()
的便捷方法,可通過從命令行添加屬性數(shù)據(jù)來擴(kuò)展現(xiàn)有對象:
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);
});
現(xiàn)在弛矛,如果您運(yùn)行上述程序够吩,您應(yīng)該會(huì)看到類似于以下內(nèi)容的輸出:
$ 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中構(gòu)建可靠的CLI工具,則prompt
可能是一個(gè)很好的選擇万俗。
喜歡這篇文章嗎湾笛? 在Twitter和LinkedIn上關(guān)注我。 您也可以訂閱RSS Feed闰歪。
其他資料
- How to read input from the command line in Node.js
- nodejs的readline模塊
-
nodejs命令行提示第三方庫-prompt
A beautiful command-line prompt for node.js - How to read and write JSON files in Node.js
- Monitoring Your Node.js App with Scout APM
- How to encrypt and decrypt data in Node.js
- How to edit an XML file with Node.js