fe-diligence

✍️ Tangxt ⏳ 2022-01-09 🏷️ Node.js

06-命令行翻译工具

结合命令行工具和 http 模块的 request 模块来做一个翻译工具

在终端输入:fy world -> 就会输出:世界

1)使用百度翻译 API

alt + 1alt + 2 -> 切换到文件目录、切换到终端

  1. 创建fanyi目录
  2. cd fanyi
  3. yarn init -y
    1. 修改版本号为0.0.1
  4. 创建src目录 -> 用来放置源代码
    1. main.ts
  5. 添加scripts -> 'start': 'ts-node-dev src/main.ts'
  6. 安装commander -> 手否要手动安装types声明?
    1. 不需要,它有个typings目录,这里边有一个index.d.ts,也就是说它自带了types声明 -> 因此我们不需要安装这个额外工具了
  7. 创建src/cli.ts -> 专门用来处理命令行
  8. 由于在做node开发 -> 安装@types/node才会有代码提示 -> 这是开发依赖
  9. cli.ts里边使用commander

Demo

💡:更改Usage的输出情况?

Usage

// import * as commander from "commander";
// const program = new commander.Command();
import { Command } from "commander";
const program = new Command();
program.version("0.0.1").name("fy").usage("<english>");

// 解析参数,比如自带的 -h,和我们通过 program.version 写的 -V
// 根据解析结果,会在终端打印相应的内容
program.parse(process.argv);

fy

👇:添加功能 -> 获取输入的单词,然后到网上查询这个单词的翻译,再显示到终端

💡:获取用户输入的单词

hello


hello

Demo

💡:如何把获取到的单词转化成中文?

申请好后,不要暴露你的 APP ID 和密钥:

接口申请

文档:百度翻译开放平台

HTTPS

一个请求示例:

https://api.fanyi.baidu.com/api/trans/vip/translate?q=apple&from=en&to=zh&appid=2015063000000001&salt=1435660288&sign=f89f9594663708c1605f3d736d01d2d4

示例

我们要关注的输入:

输入

注意,如果你的请求链接被泄漏了,这也不打紧,因为这个链接只能固定请求这个单词

比如这样:

示例

💡:不可知验证

验证

➹:开放 api 接口签名验证,保证通讯的安全性 - 知乎


知道请求地址是什么,以及需要什么参数后,我们就得用 Node.js 去发请求了,之前我们接触的 Node.js 响应,现在则是请求

2)使用 Node.js 调用百度 API

文档:https 安全超文本传输协议 - Node.js API 文档

💡:拿到百度首页的数据

数据

💡:测试百度翻译默认给出的那个接口

翻译接口

➹:nodejs 中的 process.stdout.write

➹:javascript - Difference between “process.stdout.write” and “console.log” in node.js? - Stack Overflow

💡:改成自己想要的请求地址,也就是翻译 API 接口

文档:querystring 查询字符串 - Node.js API 文档

查询字符串

测试querystring

querystring

不需要我们需要 https 这样的协议

💡:Node.js 没有自带的md5,我们需要自己安装

md5

它不支持 TS,也就是没有那个@types

我们经常会看到有些库说到「该库完美兼容 TS」,我们知道 TS 本来就兼容 JS 的,可加「完美」二字是为啥呢?

比如md5就没有完美兼容,你看看commander,它就是完美兼容的,你写啥 API 都会用代码提示

当然,前端社区也提供了有关md5types声明

yarn add @types/md5 -D

md5

使用md5

md5

得到是一个 32 位的字符串

💡:密钥和 ID 不能被泄漏

ID

4)处理 Secret & 使用 TypeScript 声明 BaiduResult

为了不泄漏密钥和 ID,我们创建了一个private.ts文件 -> 在这个文件里边写这两个数据

💡:用自己的密钥和 APP ID 去测试其它单字的翻译

翻译

💡:如何获取response的消息体?

获取消息体

💡:如何知道对象有什么?

根据响应结果来写type

type

type

💡:trans_result -> 这个trans不要缩写

因为trans有女装大佬之意,也就是「跨性别」

不知道这个英文的简写是何意就不要用缩写,比如你写 TypeScript 的缩写ts,也有女装大佬的意思

💡:错误码处理

为什么需要处理?

错误码

错误码中文化处理(本来返回英文的):

错误吗

5)表驱动编程消除多余的 if

当你的项目代码越来越多,你会看到这样的弱智代码:

if else

如何消除这样的弱智代码?

只要if else 超过 5 个,那么你的代码就一定有问题

Demo

类似一机一码这样

还有更复杂的情况,比如{}里边有多个变量赋值的情况,也可以用表驱动编程

6)英译中 & 中译英

翻译

Demo

💡:cli.ts 这是 ts 文件,我们需要把它编译成 js 文件,才能交给 node 去执行

7)如何发布 TypeScript 包到 npm

全局安装typescript

查看tsc版本

tsc -V
# Version 4.5.4

创建tsconfig文件

tsc

有了这个文件之后,你会发现原先的main.ts文件爆红了

爆红

确定这个值的类型 -> 用constructor就好了


tsconfig.json这个文件很大,我们要改的地方不多

配置

就改这个:"outDir": "dist/"

💡:@types/nodenode不是完全兼容的

兼容情况

消除 ts 报错:

Demo

💡:编译文件

直接在项目根目录敲tsc即可:

tsc

dist目录不能上传,因为有密钥

💡:发布前的配置

Demo

💡:本地测试情况

yarn link

测试情况

也可以配置别名(注意路径):

别名

💡:对比其它的,比如fanyi

npm install fanyi -g

fanyi

➹:afc163/fanyi: A 🇨🇳 and 🇺🇸 translate tool in your command line.

➹:基于百度翻译 API 的 node 插件 - 掘金


注意:不要说md5加密,一旦你这么说了,那么你就是外行了!

8)总结和问答

如果想把这个项目作为面试项目,那么你可以把密钥发布,面试完,再把你账号的你密钥给重置了

用到了三个模块:

import * as https from "https";
import * as querystring from "querystring";
import md5 = require("md5");

题目

💡:前朝的剑斩本朝的官?

俗语。指用前朝代的法律,去处理现在这个朝代的官员。现代延伸指不同时代的法律有所差异,无法直接适用

💡:importrequire 混合用

import

首选 ES Modules,次选 CommonJS

💡:tsc 默认的编译结果都是 CommonJS 规范的

你可以到tsconfig.json里边配置module选项

编译结果

使用了 TS 去开发 Node 应用后,你可以直接用 importexport 去导入导出模块,毕竟你可以直接用ts-node-dev去运行你的 TS 代码

Node 对 ES Modules 的支持 -> >=9的 Node 才支持

搜索「node esmodules 开启」: