初嘗 Node.js 開發(fā),使用到了一些小工具,在此與大家分享。一篇小白出品的小白文,歡迎大神們慷慨指導!
首先介紹具體需求:使用 .html 模板根據(jù)配置內(nèi)容生成定制的靜態(tài)網(wǎng)頁,這些靜態(tài)網(wǎng)頁被部署至 n 臺服務器上供訪問。
為何要生成大量相似度極高的靜態(tài)文件,而非使用數(shù)據(jù)庫并通過請求渲染模板呢?項目背景如此,不必糾結(jié)吐槽,本文重點在于分享幾款實用小工具。
Cheerio
使用 .html 模板生成靜態(tài)網(wǎng)頁,我們需要解析模板文件,根據(jù)配置替換相應元素。
假定該模板文件名為 template.html,我們這樣讀取它:
fs.readFile('template.html', 'utf8', function (err, data) {
if (err) {
// code
} else {
console.log(data);
}
});

需要指定字符編碼為 utf8,不然 data 值如下:

獲取到 .html 模板內(nèi)容后如何解析并定位元素呢?正則匹配是可行的,但有更好的方法:使用 Cheerio。
var cheerio = require('cheerio');
fs.readFile('template.html', 'utf8', function (err, data) {
if (err) {
// code
} else {
var $ = cheerio.load(data);
var $elem = $('.elem');
// code
}
});
其中 $ 的使用與 jQuery 中的并無太大差異。
Simple Git
機智的你發(fā)現(xiàn)我僅操作了一臺服務器上的文件,而為實現(xiàn)負載均衡用戶會訪問至其中一臺服務器,那么如何同步 n 臺服務器的資源呢?
使用 Github 作為媒介:

文件的增刪改在服務器 A 上進行,而后提交至 Github,服務器 B 從 Github 上拉取更新即可完成資源同步。
可使用 Simple Git 以執(zhí)行函數(shù)代替在終端內(nèi)執(zhí)行 Git 命令行。
Simple Git: A light weight interface for running git commands in any node.js application.
var git = require('simple-git');
git(path)
.checkout(branch)
.pull('origin', branch)
.add('.')
.commit(message)
.push('origin', branch);
PM2
NodeJS 服務部署至服務器時需要開啟 Daemon 模式,即進程始終運行于后臺。
若拋出的異常未被 try {} catch (err) {} 捕獲,uncaughtException 事件處理程序可防止進程直接退出。但一些底層錯誤引發(fā)的進程崩潰,uncaughtException 便不再適用。
可使用 PM2 實現(xiàn) NodeJS 服務的進程管理。當進程異常退出時,PM2 會嘗試重啟進程保證服務的穩(wěn)定運行。
執(zhí)行如下命令開啟服務并為該進程命名:
pm2 start ./bin/www --name [名稱]

當服務端代碼更新時,需要重啟服務,執(zhí)行:
pm2 restart [名稱]

原先的進程會被 kill,并開啟新的進程。故無需通過 lsof 端口號手動 kill 進程。
Express Http Proxy
Express Http Proxy: Express middleware to proxy request to another host and pass response back to original caller.
渲染一個前端頁面所需的數(shù)據(jù)可能來源于 n 個不同域的 n 個接口。瀏覽器存在跨域行為,跨 n 個域請求 n 個接口不現(xiàn)實。API 層就是要將這些接口和諧統(tǒng)一為一個接口供前端調(diào)用。扯遠了...需求背景沒辣么復雜,需要搬出 RPC(遠程調(diào)用)這個概念。但希望將來能有機會與大家分享經(jīng)驗。
其實我只想轉(zhuǎn)發(fā)一個請求解決跨域問題。使用到了 Express Http Proxy。
var proxy = require('express-http-proxy');
router.get('/hybrid/topic_reply/:id', proxy('backend.test.env', {
userResDecorator: function (proxyRes, proxyResData) {
var data = JSON.parse(proxyResData.toString('utf8'));
return JSON.stringify(data);
}
}));
此時訪問 [我的域名]/hybrid/topic_reply/:id 可請求到 backend.test.env/hybrid/topic_reply/:id 的數(shù)據(jù)。其中 data 可隨意修改,return 值為請求返回值。
作者:呆戀小喵
我的后花園:https://sunmengyuan.github.io/garden/
我的 github:https://github.com/sunmengyuan
原文鏈接:https://sunmengyuan.github.io/garden/2017/10/20/node-tool.html