node 读取文件和命令交互

694 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

今天的主要目的是完成读取配置文件的函数封装, 和封装命令行的交互函数。

读取配置文件

新建readconfig.ts文件,这里使用readFileSync读取,避免异步,设置encodingutf-8,可以获得deploy-config.json的内容,使用JSON.parse将读取的数据转换为变量,这里使用try catch捕获错误的原因是: 当文件不存在时,在macOSLinux Windows下会报错。

/*
 * @Author: Aisanyi
 * @Date: 2022-04-05 11:54:30
 * @LastEditors: Aisanyi
 * @LastEditTime: 2022-04-05 12:28:04
 * @Description: 读取配置文件
 */

import chalk from "chalk";
import { readFileSync } from "fs";

export function readConfig() {
  let data: string = "{}";
  try {
    data = readFileSync("deploy-config.json", {
      encoding: "utf-8",
    });
  } catch {
    console.error(
      chalk.red(
        `读取文件失败, 请检查是否有 ${chalk.blue(
          "deploy-config.json"
        )} 文件, 没有请运行 ${chalk.green("deploy-cli init")} 命令`
      )
    );
  }

  return JSON.parse(data);
}

测试函数是否运行正常

index.ts 文件中新增测试函数的命令。

import { readConfig } from "./readconfig.js";

// 测试命令
program
  .command("test")
  .description("测试一些函数")
  .action(() => {
    const config = readConfig();
    console.log(config)
  });

运行 pnpm test , 运行 deploy-cli test, 结果如下(无配置文件的情况): image.png 接下来运行 deploy-cli init deploy-cli test,无报错。 image.png

封装交互

使用readline模块封装,解说一个info提示, 然后等待用户的输入,

/*
 * @Author: Aisanyi
 * @Date: 2022-04-05 13:17:57
 * @LastEditors: Aisanyi
 * @LastEditTime: 2022-04-05 13:24:53
 * @Description: 交互
 */
import { createInterface } from "readline";

export function echo(info: string) {
  return new Promise((res) => {
    const readL = createInterface({
      input: process.stdin,
      output: process.stdout,
    });

    readL.question(info, (answer) => {
      readL.close();
      res(answer);
    });
  });
}

测试

调整index.ts的测试命令

// 测试命令
program
  .command("test")
  .description("测试一些函数")
  .action(() => {
    const config = readConfig();
    console.log(config)
    echo('请输入你的用户名: ').then(res => {
      console.log(res)
    })
  });

运行 pnpm test , 运行 deploy-cli test, 结果如下: image.png