需求
在项目的package.json里加一个脚本,启动一个命令行交互,从给定的几个选项中选择一个并打印输出
实现
在package.json
文件中添加一个脚本来启动命令行交互,你可以使用Node.js的内置模块readline
来实现。以下是一个简单的示例,展示了如何创建一个交互式命令行程序,用户可以从几个预设的选项中选择,并在用户做出选择后打印输出:
json
json
{
"scripts": {
"interactive": "node interactive.js"
}
}
然后,你需要创建一个名为interactive.js
的文件,内容如下:
arduino
javascript
const readline = require('readline');
// 创建一个readline接口
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// 显示选项并请求用户输入
rl.question('请选择一个选项 (1-4): ', (answer) => {
// 根据用户选择打印不同的输出
switch(answer) {
case '1':
console.log('你选择了选项1');
break;
case '2':
console.log('你选择了选项2');
break;
case '3':
console.log('你选择了选项3');
break;
case '4':
console.log('你选择了选项4');
break;
default:
console.log('无效的选项,请输入1到4之间的数字');
}
// 完成后关闭readline接口
rl.close();
});
确保你的interactive.js
文件在项目的根目录下,然后你可以在命令行中运行npm run interactive
来启动这个脚本。程序会提示用户输入一个选项,然后根据用户的选择打印相应的输出。
如果你想在interactive.js
脚本中列出所有选项,并让用户选择,你可以按照以下方式修改脚本:
javascript
javascript
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const options = [
'选项1: 执行操作A',
'选项2: 执行操作B',
'选项3: 执行操作C',
'选项4: 执行操作D'
];
// 显示所有选项
console.log('请选择一个操作:');
options.forEach((option, index) => {
console.log(`${index + 1}. ${option}`);
});
// 请求用户输入
rl.question('> ', (answer) => {
let choice = parseInt(answer) - 1; // 将输入转换为从0开始的索引
if (choice >= 0 && choice < options.length) {
console.log(`你选择了:${options[choice]}`);
// 这里可以添加执行选项对应操作的代码
} else {
console.log('无效的选项,请选择1到4之间的数字。');
}
rl.close(); // 关闭readline接口
});
在这个脚本中,我们首先定义了一个options
数组,其中包含了所有的选项。然后,我们使用forEach
循环来遍历这个数组,并打印每个选项。用户输入他们的选择后,脚本会将输入的字符串转换为整数,并减去1,以匹配数组的索引(因为数组索引是从0开始的,而用户的选择是从1开始的)。
然后,脚本会检查用户的选择是否有效,并打印相应的信息。如果用户输入了一个无效的选项,脚本会提示用户重新输入一个有效的选项。最后,无论用户的选择是什么,脚本都会关闭readline
接口。
用户可以通过运行npm run interactive
来启动这个交互式脚本,并从列出的选项中选择他们想要执行的操作。
readline其他使用方式举例
readline
模块提供了多种方式来处理命令行输入。以下是一些不同的使用方式示例:
- 连续读取多行输入 : 使用
readline
可以连续读取用户的多行输入,直到用户输入特定的结束命令。
ini
javascript
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let inputLines = [];
rl.on('line', (line) => {
inputLines.push(line);
if (line === '结束') { // 用户输入'结束'作为输入的结束标志
rl.close();
console.log('接收到的所有输入:', inputLines);
}
});
rl.prompt();
- 错误处理: 当用户输入无效数据时,可以捕获错误并提示用户重新输入。
javascript
javascript
rl.question('请输入一个数字: ', (answer) => {
if (isNaN(answer)) {
console.log('错误:请输入一个有效的数字。');
// 可以在这里调用自身以重新提示输入
} else {
console.log(`你输入的数字是:${answer}`);
rl.close();
}
});
- 设置历史记录 :
readline
接口可以设置历史记录,用户可以使用上下箭头键浏览之前的输入。
arduino
javascript
const readlineInterface = readline.createInterface({
input: process.stdin,
output: process.stdout,
historySize: 100 // 设置历史记录大小
});
- 使用Tab自动补全 : 可以为
readline
接口设置自动补全功能,当用户按下Tab键时,自动补全命令或选项。
ini
javascript
const completer = (line) => {
const completions = ['选项1', '选项2', '选项3', '选项4']; // 补全选项
const hits = completions.filter((c) => c.startsWith(line));
// 根据输入的行返回匹配的补全列表
return [hits.length ? hits : completions, line];
};
rlInterface = readline.createInterface({
input: process.stdin,
output: process.stdout,
completer
});
- 监听特定事件 :
readline
接口可以监听多种事件,例如pause
、resume
、close
等。
javascript
javascript
rl.on('pause', () => {
console.log('输入流已暂停');
});
rl.on('resume', () => {
console.log('输入流已恢复');
});
rl.on('close', () => {
console.log('readline接口已关闭');
});
- 使用
readline
同步读取 :readline
也可以同步地读取一行输入,这在某些情况下可能很有用。
ini
javascript
const readlineSync = require('readline-sync');
const input = readlineSync.question('请输入一些内容: ');
console.log(`你输入的内容是:${input}`);
readline-sync
是一个第三方模块,提供了同步的读取功能,使用前需要先安装:npm install readline-sync
。
这些示例展示了readline
模块的灵活性和强大功能,可以根据不同的需要选择使用。