求教如何在 Node.js 程序运行时优雅地实现 cli 交互?

发布于 1周前 作者 itying888 来自 nodejs/Nestjs

求教如何在 Node.js 程序运行时优雅地实现 cli 交互?

cli

预期目标大致如上图所示。

我当前是用 readLine 模块去读取每次输入的字符串并处理字符串,然后再分发到不同的处理函数。

但是感觉这样的方法在处理字符串时要考虑各种命令+参数的可能,还要考虑可能的错误输入,不仅逻辑复杂,而且非常不优雅。

在网上搜了一圈,有推荐用 inquirer 模块的,但我了解了一下,这个模块似乎是用于“提出问题-输入回答”这样的模式,似乎不太契合 cli 交互这种逻辑。

那么问题来了,有没有适合于我这种需求的模块?在此先谢过各位


7 回复

这种东西我以前写过,没有现成的,最后越来越复杂会无限接近 Shell
所以,不如直接用 shell 吧,你程序创建一个本地 socket,再弄一个命令进程通过这个 socket 和主进程通信。

我觉得像是一个 repl https://nodejs.org/api/repl.html
就是实现一个 Custom Evaluation Function

但我想要的更多还是一些自定义的命令,用 shell 去运行的话,还要定义一堆函数、alias 之类的,可能还是上面提到的 repl 更适合我

这个好像比较适合,我先去研究研究

在 Node.js 中实现优雅的 CLI(命令行界面)交互,你可以使用 readline 模块,它提供了从标准输入/输出读取和写入的基本功能。以下是一个示例,展示了如何在 Node.js 程序中实现简单的 CLI 交互:

const readline = require('readline');

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

function askQuestion(query) {
  return new Promise(resolve => rl.question(query, resolve));
}

(async () => {
  console.log('Welcome to the Node.js CLI example!');
  
  let userName = await askQuestion('What is your name? ');
  console.log(`Hello, ${userName}!`);

  let userAge = await askQuestion('How old are you? ');
  console.log(`You are ${userAge} years old.`);

  rl.close();
})();

在这个示例中,我们:

  1. 使用 readline.createInterface 创建了一个接口 rl,它连接到标准输入和输出。
  2. 定义了一个 askQuestion 函数,它返回一个 Promise,该 Promise 在用户回答后解析。
  3. 使用 async/await 语法,在程序运行时按顺序询问用户的名字和年龄,并打印出响应。

这种方法使得代码易于阅读和维护,同时也提供了良好的用户体验。你可以根据需要扩展这个示例,添加更多的交互逻辑或错误处理。

记得在运行这个脚本时,确保你的 Node.js 环境已经正确安装和配置。

回到顶部