Node.js文件模块——命令行项目

29 阅读3分钟

一个基于文件的todo工具

yarn global add node-todo-1

截屏2023-03-22 15.08.46.png

新增了“买晚饭的任务” 截屏2023-03-22 15.10.30.png

已经完成 截屏2023-03-22 15.12.02.png

直接使用t add xx来添加任务 截屏2023-03-22 15.12.59.png

t clear清除全部任务

这就是今天的目标工具。

具体实现

功能

  • 可以列出所有的todo
  • 可以新增todo
  • 可以删除todo
  • 可以编辑todo
  • 可以标记已经完成的todo

命令

  • t
  • t add
  • t clear
项目创建

在node-todo-1目录下,yarn init -y初始化项目,创建package.json文件。

yarn add commander 安装commander的依赖。

进入commander的官方github进行CRM。

截屏2023-03-23 14.37.53.png

截屏2023-03-23 14.38.03.png

添加子命令:

截屏2023-03-23 15.08.56.png

截屏2023-03-23 15.09.09.png

通过一些测试可以得知最后一项是command对象所以要slice一下。 截屏2023-03-23 15.12.32.png 截屏2023-03-23 15.12.22.png

实现add功能

这里我们可以新建一个js文件,将add的方法然后在cli.js中引入。

index.js

截屏2023-03-25 14.21.38.png

cli.js 截屏2023-03-25 14.21.44.png

截屏2023-03-25 14.21.57.png 这样就成功引入并且执行了。

add要实现的时候在数据库中添加item。我们现在需要创建数据库。

逻辑中我们用到了fs.readFile语法 截屏2023-03-25 14.56.53.png

选项部分flag选择a+因为我们要追加内容并且自动生成文件。

截屏2023-03-25 14.59.47.png

截屏2023-03-25 15.11.09.png

我们再次执行,在家目录下的得到一个buffer。

截屏2023-03-25 15.11.24.png

如果我们发现之前的数据是空的,那么就要创建一个空的数组用来存储。

截屏2023-03-25 15.23.22.png

尝试运行node cli add task1

截屏2023-03-25 15.23.52.png

虽然能够成功运行,但是得到的结果并非是我们理想中的结果,我们希望它返回一个字符串。

这里我们用到了fs.writeFile()方法 截屏2023-03-25 15.26.01.png

截屏2023-03-25 15.28.26.png

这样就基本实现了add功能。

截屏2023-03-25 22.13.26.png 可以看到代码非常冗杂,所以可以对其进行封装优化。

我们的核心思路是:读取之前任务;添加新的任务;存储这个任务到文件。就这三步,也就是说我们的代码应该最好只有如下三行:

截屏2023-03-25 22.17.39.png 接下来是面向接口编程封装。 新建db.js

因为readFile的过程是一个异步的代码,所以我们需要用promise进行一个封装。

read方法: 截屏2023-03-25 22.26.45.png

由于read返回的是promise所以要用await

截屏2023-03-25 22.28.15.png

截屏2023-03-25 22.34.43.png

测试:

截屏2023-03-25 22.35.00.png

封装完成,最后index.js如下。

截屏2023-03-25 22.35.56.png

实现clear功能

实现clear就是要清空当前db的所有数据,也就是直接把db写成一个空数组就可以了。

截屏2023-03-26 15.58.26.png

实现展示任务

process.argv可以展示用户对此程序的运行记录。

截屏2023-03-27 20.36.21.png

现在写showAll的方法,逻辑就是:读取已有任务并打印出任务

截屏2023-03-27 20.34.19.png

测试成功: 截屏2023-03-27 20.35.21.png

添加完成状态 截屏2023-03-27 21.34.06.png

截屏2023-03-27 21.34.28.png

这时我们的done状态是有问题的,需要引入一个列表。列表在命令行中是很难实现的,所以我们引入一个库。这里我们选择inquirer

官方的模版案例: 截屏2023-03-28 21.12.03.png

测试样例: 截屏2023-03-28 21.17.50.png

截屏2023-03-28 21.18.09.png

很明显123并不是我们需要的结果,所以我们对choices进行一个操作,返回对list的一个数组 截屏2023-03-28 21.20.17.png

截屏2023-03-28 21.21.22.png

添加退出选项并优化

截屏2023-03-28 21.27.29.png

完善所有操作逻辑

如果选中了一个任务,那么它可以有五种操作选项:

  1. 退出
  2. 已完成
  3. 未完成
  4. 改标题
  5. 删除 截屏2023-03-29 13.30.33.png

具体操作如下:

截屏2023-03-29 13.31.36.png

如果选择创建任务,那么就只需要把任务push进list即可 截屏2023-03-29 13.31.49.png

最终效果:

截屏2023-03-29 13.33.29.png