本站使用「署名 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、編程上的一些問題,也會在羣裏不按期的分享一些技術沙龍的資料。
喜歡折騰的小夥伴歡迎掃碼添加好友。(請註明來源和目的,不然不會經過審覈) 關於折騰羣入羣的那些事