Node.js readline 模块

Java FileNode.js 内置模块


Node.js 的 readline 模块是一个用于从可读流(如 process.stdin)逐行读取数据的接口。它提供了一种简单的方式来处理命令行输入,非常适合创建交互式命令行应用程序。


基本使用方法

引入 readline 模块

要使用 readline 模块,首先需要引入它:

const readline = require('readline');

创建 readline 接口

创建 readline.Interface 实例是使用该模块的核心:

实例

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

这里我们创建了一个接口,它将从标准输入(键盘)读取数据,并将输出写入标准输出(控制台)。


主要方法和事件

逐行读取输入

使用 question() 方法可以向用户提问并等待回答:

实例

rl.question('你叫什么名字?', (answer) => {
  console.log(`你好,${answer}!`);
  rl.close();
});

监听 line 事件

当用户输入一行内容并按下回车时,会触发 line 事件:

实例

rl.on('line', (input) => {
  console.log(`收到:${input}`);
  if (input === 'exit') {
    rl.close();
  }
});

关闭接口

使用 close() 方法关闭接口并释放资源:

实例

rl.close();

当接口关闭时,会触发 close 事件:

实例

rl.on('close', () => {
  console.log('再见!');
  process.exit(0);
});

高级功能

历史记录

readline 模块支持命令历史记录功能:

实例

rl.history = ['命令1', '命令2'];  // 设置历史记录

用户可以使用上下箭头键浏览历史命令。

自定义补全

可以实现自定义的 Tab 补全功能:

实例

rl.on('completer', (line) => {
  const completions = ['help', 'exit', 'show'];
  const hits = completions.filter((c) => c.startsWith(line));
  return [hits.length ? hits : completions, line];
});

光标控制

readline 提供了一些方法来控制光标:

实例

readline.cursorTo(process.stdout, 10, 5);  // 移动光标到第10列第5行
readline.clearLine(process.stdout, 0);     // 清除当前行
readline.clearScreenDown(process.stdout);  // 清除光标以下的内容

实际应用示例

创建一个简单的命令行问答程序

实例

const readline = require('readline');

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

const questions = [
  '你叫什么名字?',
  '你今年多大了?',
  '你最喜欢的编程语言是什么?'
];

const answers = [];

function askQuestion(i = 0) {
  if (i >= questions.length) {
    console.log('谢谢你的回答:', answers);
    return rl.close();
  }

  rl.question(questions[i], (answer) => {
    answers.push(answer);
    askQuestion(i + 1);
  });
}

askQuestion();

创建一个简单的命令行计算器

实例

const readline = require('readline');

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

function calculator() {
  rl.question('请输入表达式 (例如: 2 + 3 或输入 exit 退出): ', (input) => {
    if (input === 'exit') {
      return rl.close();
    }

    try {
      const result = eval(input);  // 注意:实际应用中应避免直接使用eval
      console.log(`结果: ${result}`);
    } catch (e) {
      console.log('无效的表达式');
    }

    calculator();  // 递归调用继续下一次计算
  });
}

calculator();

安全注意事项

  1. 避免使用 eval():上面的计算器示例使用了 eval(),这在生产环境中是不安全的,因为它会执行任何输入的JavaScript代码。实际应用中应该使用专门的表达式解析器。

  2. 输入验证:始终验证用户输入,防止注入攻击或其他安全问题。

  3. 错误处理:为所有异步操作添加适当的错误处理。


总结

Node.js 的 readline 模块是构建交互式命令行工具的强大工具。通过它,我们可以:

  • 轻松获取用户输入
  • 创建问答式交互界面
  • 实现命令历史记录
  • 添加Tab补全功能
  • 控制终端光标和输出

掌握 readline 模块是开发Node.js命令行工具的重要一步,希望本文能帮助你理解和使用这个模块。

Java FileNode.js 内置模块