Node.js的内置模块readline(一)

需求

在项目的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模块提供了多种方式来处理命令行输入。以下是一些不同的使用方式示例:

  1. 连续读取多行输入 : 使用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();
  1. 错误处理: 当用户输入无效数据时,可以捕获错误并提示用户重新输入。
javascript 复制代码
javascript
rl.question('请输入一个数字: ', (answer) => {
  if (isNaN(answer)) {
    console.log('错误:请输入一个有效的数字。');
    // 可以在这里调用自身以重新提示输入
  } else {
    console.log(`你输入的数字是:${answer}`);
    rl.close();
  }
});
  1. 设置历史记录readline接口可以设置历史记录,用户可以使用上下箭头键浏览之前的输入。
arduino 复制代码
javascript
const readlineInterface = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  historySize: 100 // 设置历史记录大小
});
  1. 使用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
});
  1. 监听特定事件readline接口可以监听多种事件,例如pauseresumeclose等。
javascript 复制代码
javascript
rl.on('pause', () => {
  console.log('输入流已暂停');
});

rl.on('resume', () => {
  console.log('输入流已恢复');
});

rl.on('close', () => {
  console.log('readline接口已关闭');
});
  1. 使用readline同步读取readline也可以同步地读取一行输入,这在某些情况下可能很有用。
ini 复制代码
javascript
const readlineSync = require('readline-sync');
const input = readlineSync.question('请输入一些内容: ');
console.log(`你输入的内容是:${input}`);

readline-sync是一个第三方模块,提供了同步的读取功能,使用前需要先安装:npm install readline-sync

这些示例展示了readline模块的灵活性和强大功能,可以根据不同的需要选择使用。

相关推荐
滚雪球~5 小时前
npm error code ETIMEDOUT
前端·npm·node.js
沙漏无语5 小时前
npm : 无法加载文件 D:\Nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本
前端·npm·node.js
m0_748234526 小时前
前端Vue3字体优化三部曲(webFont、font-spider、spa-font-spider-webpack-plugin)
前端·webpack·node.js
丰云15 小时前
一个简单封装的的nodejs缓存对象
缓存·node.js
泰伦闲鱼15 小时前
nestjs:GET REQUEST 缓存问题
服务器·前端·缓存·node.js·nestjs
敲啊敲952716 小时前
5.npm包
前端·npm·node.js
j喬乔17 小时前
Node导入不了命名函数?记一次Bug的探索
typescript·node.js
z千鑫18 小时前
【前端】入门指南:Vue中使用Node.js进行数据库CRUD操作的详细步骤
前端·vue.js·node.js
小马哥编程1 天前
原型链(Prototype Chain)入门
css·vue.js·chrome·node.js·原型模式·chrome devtools
蜜獾云1 天前
npm淘宝镜像
前端·npm·node.js