node 命令行程序开发之实现中英翻译功能
2017年06月23日
平时电脑上执行 node 程序时,必须进入此程序目录,然后在终端输入:
node index.js
才能执行此程序。
但是这样子效率不高,如果可以只输入一个命令单词就可以执行,那就会很高效了。例如就像在终端列出文件的命令这样:
ls
编写最简单的 node 命令行程序
从最简单的 hello world 程序说起,编写一个文件,文件名为hello
,文件内容为:
1#!/usr/bin/env node 2console.log('hello world');
我估摸着第一行的意思应该是调用 node 的执行环境执行此脚本。
保存文件之后需要修改此文件的权限为 755,表示具有执行权限
chmod 755 hello
最近在学习 Linux 的相关知识点,在 Linux 中,所有文件都会有三个权限分别为:读、写和执行。然后每个权限有自己的代码:读-4,写-2,执行-1。所谓的 755 权限便是指此文件的拥有者具有三个权限,然后此文件的群组和路人只具有 5 的权限,即读和执行,没有写的权限。
总之要执行脚本,最重要是要设置脚本的执行权限。
可通过
ls -l
来查看文件的具体信息,权限表示类似这样:lrwxr-xr-x
。
之后便可以执行此文件了,在终端输入:
./hello
便可执行此脚本,执行后便会输出hello world
。./
表示相对路径,此路径。
如果在其他路径下也想要执行此脚本,就必须将此脚本加入至环境变量$PATH 中。
下面命令会创建此脚本的符号链接至目录/usr/local/bin
,即环境变量的目录:
ln -s 绝对路径/hello /usr/local/bin/hello
所谓符号链接,即快捷方式,之后打开终端便可以随时执行此脚本了:
hello
翻译脚本命令行程序的实现
1#!/usr/bin/env node 2var http = require('http'); 3// 接收输入的单词 4var word = process.argv.slice(2).join(' '); 5word = encodeURIComponent(word); 6// 翻译的API 7var link = 'http://fanyi.youdao.com/openapi.do?keyfrom=f2ec-org&key=1787962561&type=data&doctype=json&version=1.1&q=' + word; 8// 联网翻译 9http.get(link, function (res) { 10 // console.log(res.headers); 11 var body = []; 12 res.on('data', function (chunk) { 13 body.push(chunk); 14 }); 15 res.on('end', function () { 16 body = Buffer.concat(body).toString(); 17 body = JSON.parse(body); 18 body = JSON.stringify( 19 body, 20 (key, value) => { 21 if (key == 'errorCode') { 22 return undefined; 23 } 24 if (key == 'basic') { 25 return value.explains; 26 } 27 if (key == 'traslation') { 28 return value.toString(); 29 } 30 if (key == 'web') { 31 return value.map((item) => `${item.key} --- ${item.value.join(';')}`); 32 } 33 return value; 34 }, 35 4 36 ); 37 // 在终端输出翻译结果 38 console.log(body); 39 }); 40});
上面即全部的代码,逻辑很简单,终端输入单词,调用翻译 API 接口,然后终端输出翻译之后的结果。
process.argv[2]
的意思为接收用户输入的第一个参数,为什么后面的数值是 2 呢,因为 0 和 1 都被他们自己的一个属性占用掉了,你可以 console 自己测试。
保存上面文件为translate
文件,不需要添加后缀名。然后再添加符号链接即快捷方式至环境变量中即可,为了简单,可以使快捷方式文件名为t
表示。
之后想要查询单词时,直接在终端输入:
t apple
即可得到想要的翻译结果,也可翻译中文至英文:
t 苹果