本站使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或从新修改使用,但须要注明来源。 署名 4.0 国际 (CC BY 4.0)html
本文做者: 苏洋node
建立时间: 2018年08月31日 统计字数: 4273字 阅读时间: 9分钟阅读 本文连接: soulteary.com/2018/08/31/…git
最近整理博客,发现好久没有介绍语言相关的小用法了,正巧休息的时候把代码仓库归置了一遍,用几个简短的例子,聊聊 Node.js
除了写业务脚本、作构建运行时,它还能作些什么有趣的事情吧。shell
在作持续集成中,偶尔会遇到须要解析 API 结果,或者读取文件,获取文件指定数据的需求,当使用常规的 shell
难以完成需求的时候,相比较 Python 来讲使用 Node 作为粘合剂来获取数据不失为一个好的方案,由于写出的代码将会更简单明了。编程
好比你但愿获取到某些 API 中的特殊字段,而后再次进行参数拼装,请求其余的 API ,完成某种程度的彻底自动化操做。缓存
使用 Node.js
的 fs.readFileSync
方法读取 /dev/stdin
便可,好比:bash
curl SOME_API_WITH_ARGS | node -e 'console.log(JSON.parse(require("fs").readFileSync("/dev/stdin").toString()).data);'
复制代码
固然,你也能够把这个脚本保存为文件,而后进行调用,结果是同样的。微信
const fs = require("fs");console.log(JSON.parse(fs.readFileSync("/dev/stdin").toString()).iid);
复制代码
若是将上面的代码保存为 pipe.js
,那么接下来执行下面的代码,将会获得相同的结果。curl
echo data | node pipe.js
复制代码
一提到数据清理,你们会不自觉地想到 SQL
、Python
、R
,可是有的时候,并不须要进行大量编码,使用系统内置的 Shell
配合 Node.js
在实现和效率上都会变的更快。函数
程序构建完毕,想看看到底有多少内容是冗余的,那么便要进行文件去重操做。一般咱们并不可以简单依赖文件名称进行去重,这个时候就要使用文件内容签名来作了。
使用静态编译的 shell 工具能够快速计算出文件的签名:
find . | xargs -I {} shasum -a 256 {}
shasum: ./dist:
shasum: ./dist/some:
b0a635b4d6be1a6f14f25c64e3ff6fa2ccacc4e55be93d6f542184a386f748c8 ./dist/some/aea0d6c054cf3fadf5bb.js
9498cb1451fc6d02612610f109ebb29dc94957e2a2741b701443182573837bfc ./dist/some/
复制代码
这个输出结果会有许多看起来无心义的行,这个时候配合上一小节的方法,将输出结果当参数传递给 Node.js 程序只须要几行代码就能将文件分析完毕。
const fs = require('fs');
const shasumList = fs.readFileSync('/dev/stdin').toString().split('\n').filter(l => l).filter(l => l.match(/^\w{64}\s+\S+$/));
let reduceResult = {};
shasumList.map(item => {
const [shasum, name] = item.match(/(\w+)\s+(\S+)/);
return {shasum, name};
}).forEach(item => {
reduceResult[item.shasum] = reduceResult[item.shasum] || [];
reduceResult[item.shasum].push(item.name);
});
console.log(reduceResult);
复制代码
固然,若是你愿意的话,写个简单的目录扫描,而后使用 Node.js
的 crypto
模块直接计算签名也是能够的。
const fs = require('fs');
const crypto = require('crypto');
const secret = '';
const hash = crypto.createHmac('sha256', secret).update(fs.readFileSync(`${item.name}-${item.id}.html`).toString()).digest('hex');
复制代码
标题看起来是否是很熟悉,通常提到柯里化,咱们会想到使用更少的参数去封装后面的高阶函数。使用 Node.js
能够提供相似的功能,只不过这里的 curry
发生的级别不是代码级别。
好比我找到了一些零几年古老的代码片断,它们本来不存在于 CVS 版本控制系统中,假若直接添加,提交时间就是当下提交的时刻。可是这些文件自己提供了建立时间,能够做为原始信息一并入库。
这个时候,使用 git commit --date
能够修改提交时间戳,可是实际使用起来却很麻烦,由于它要保持一个特定的格式:ddd, DD MMM YYYY HH:MM:SS +8000
。
若是这里有一个小脚本能够将输入的时间自动转换成这个格式,那么处理这些文件就方便多了。
#!/usr/bin/env node
var moment = require('moment');
var argvs = process.argv.slice(2);
console.log('input:', argvs[0]);
if (!argvs.length) {
console.log('useage: tool timestamp');
process.exit(1);
}
console.log('output:\n');
if (argvs.length === 2) {
console.log('git add .');
console.log('gc -m "' + argvs[0] + '" --date="' + moment(new Date(argvs[1])).format('ddd, DD MMM YYYY HH:MM:SS +8000') + '"');
console.log('git push');
} else {
console.log('gc --amend -m "' + moment(new Date(argvs[0])).format('ddd, DD MMM YYYY HH:MM:SS +8000') + '" --date="' + moment(new Date(argvs[0])).format('ddd, DD MMM YYYY HH:MM:SS +8000') + '"');
console.log('git push -f');
}
复制代码
固然,若是你将这个脚本保存到一个全局能够找到的路径,而后赋予执行权限,还能够在脚本中添加 exec
操做,让代码可以自动提交。
除了做为数据管理的工具外,Node.js
提供的文件操做模块,还能辅助咱们进行文件整理。
在购买了 XX音乐包
、XX会员
以后,发现歌曲音质确实好了很多,可是音质的代价是不得不将大量文件缓存在移动设备中,即便用着 256G
的移动设备,也不堪终年累月的缓存之重。因而我把设备中的音乐导出、也从其余地方下载了一些音乐,计划将它们同一归置到一台专门的设备中进行管理存放,可是几千首随机生成的文件名十分不利于归档,好在多数文件中包含了音乐信息 ID3
,配合解析软件包,让程序自动将他们从新命名和进程存放吧。
const {readdirSync, renameSync, statSync, unlinkSync, existsSync, mkdirSync} = require('fs');
const {join} = require('path');
const {inspect} = require('util');
const {parseFile} = require('music-metadata');
const {rootDir} = require('./config');
const files = readdirSync(rootDir).
filter((file) => file.endsWith('.m4a') || file.endsWith('.flac') || file.endsWith('.mp3'));
files.forEach((file) => {
const fullPath = join(rootDir, file);
parseFile(fullPath, {native: true}).then((metadata) => {
const name = `${metadata.common.title.trim()} - ${metadata.common.artist.trim()}.${file.split('.').pop()}`;
if (name !== file) {
renameSync(fullPath, join(rootDir, name));
}
}).catch((err) => {
if (statSync(fullPath).size < 10) {
unlinkSync(fullPath);
} else {
console.log('parse error', statSync(fullPath).size);
console.error(err.message);
}
});
});
readdirSync(rootDir).filter((file) => {
if (file.includes(' - ')) {
let lastPart = file.split(' - ')[1];
const name = lastPart.replace(/\..+/, '');
const target = join(rootDir, name);
if (!existsSync(target)) mkdirSync(target);
renameSync(join(rootDir, file), join(target, file));
}
});
复制代码
像上面使用 Node
只写十几行代码就能完成任务的事情还有不少,好比以前:
我如今有一个小小的折腾群,里面汇集了一些喜欢折腾的小伙伴。
在不发广告的状况下,咱们在里面会一块儿聊聊软件、HomeLab、编程上的一些问题,也会在群里不按期的分享一些技术沙龙的资料。
喜欢折腾的小伙伴欢迎扫码添加好友。(请注明来源和目的,不然不会经过审核) 关于折腾群入群的那些事