做者:Scott Robinson翻譯:瘋狂的技術宅javascript
yargs
是一個用來處理命令行參數的包,能夠幫你處理自行設置的命令行標誌和輸入的任何類型的數據,其中包括布爾值、浮點數和字符串等。這個包很是簡單明瞭,不須要在項目中編寫大量的樣板代碼。前端
yargs 可以幫你處理 「用法幫助」 輸出,能夠輕鬆地告訴用戶在使用你程序時須要輸入哪些選項,包括哪些是必選的。java
var argv = require('yargs') .usage('Usage: $0 -x [num] -y [num]') .demand(['x','y']) .argv; console.log('Pow(x, y):', Math.pow(argv.x, argv.y));
把上面的代碼保存爲 index.js
,而後在命令行中執行 node index.js -x 3
,會看到以下消息:node
Usage: index.js -x [num] -y [num] Options: -x [required] -y [required] Missing required argument: y
yargs 可以提示咱們命令行中到底缺乏什麼參數,而咱們只須要簡單的調用 .usage()
和 .demand()
方法就好了。git
這是一個很是實用的包。程序員
它輪詢 Node 事件循環並跟蹤完成請求所需的時間,若是發現延遲時間太長,則 toobusy
會通知你,而後你就能夠將 HTTP 503 "Service Unavailable" 狀態碼返回給客戶端。github
這種處理是很重要的,由於服務器越忙,請求所等待的時間也就越長。這很快就成爲一個很複雜的問題,隨着時間的流逝會愈來愈嚴重。若是你聽之任之的話,那麼服務將會崩潰。若是咱們能及時的中止一些請求的處理,並返回 HTTP 503,這樣的話至少還能處理一些請求。面試
能夠輕鬆的用 npm 命令安裝 toobusy
:shell
npm install toobusy
而後把它和相似 Express 的東西集成在一塊兒:
var toobusy = require('toobusy'), express = require('express'); var app = express(); // 若是服務器壓力過大將會阻止請求 app.use(function(req, res, next) { if (toobusy()) { res.send(503, "Too many users!"); } else { next(); } }); var server = app.listen(3000); process.on('SIGINT', function() { server.close(); toobusy.shutdown(); // 正常退出 process.exit(); });
不須要寫多少代碼,也不用太多的配置就能繼承到咱們本身的項目中。
在命令行上很難開發出一個好用的用戶界面,由於用於和用戶交互的只是命令行窗口。那麼你該如何去提示一些重要的信息呢?在輸出的文本中添加格式不失爲一種好方法。Express 就是一個很典型的例子,從它的輸出中,你能夠很輕鬆地快讀找到重要的信息。
如下是 chalk 支持的樣式列表:
bold
underline
dim
reset
hidden
inverse
italic
(並不是全部環境都支持)strikethrough
(任何環境下都不支持)red
black
green
white
yellow
blue
(在 Windows 上會使用較亮的版本,由於普通的藍色很難辨認)cyan
gray
magenta
bgBlue
bgBlack
bgRed
bgGreen
bgCyan
bgYellow
bgWhite
bgMagenta
雖然官方只支持這些顏色,可是任何符合 xterm 標準的終端均可以使用完整的 8 位色代碼。
只須要將字符串傳給用於着色或格式化的函數就能輕鬆的格式化這些文本。若是你須要讓用戶注意到嚴重錯誤提示,能夠用下面的格式:
var chalk = require('chalk'); var str = chalk.red.bold('ERROR: ') + chalk.bold('Everything just blew up...'); console.log(str);
好用的調試器很難找,尤爲是那些帶有好用的 GUI 的調試器,node-inspector 爲你提供了一個網頁 GUI 來幫助調試代碼。它有標準調試器的全部功能,例如斷點、單步執行、退出代碼以及變量檢查等,另外還有一些不太經常使用的功能,可是這些功能很是有用,例如 CPU 和堆分析、網絡客戶端請求檢查以及實時編輯運行代碼的功能。
不過 Node Inspector 只與 Chrome 和 Opera 兼容,由於它使用了Blink Developer Tools,並與Node兼容。
一直以來我很是依賴控制檯輸出進行調試,這會花費了大量的時間。使用 GUI 可以大大的節省調試時間。
若是你的 Node 程序須要在命令行下支持除簡單的文本輸入輸出以外的其餘操做,那麼你應該須要 terminal-kit。 terminal-kit 簡化了與用戶交互的許多東西,使你能夠專一於在程序中開發重要的內容。terminal-kit 的主要功能是:
chalk
)有不少適合終端工具包的例子。例如,若是你須要從網上下載一些內容,那麼就須要向用戶顯示進度條。下面的代碼用來顯示虛擬進度條:
var terminal = require( 'terminal-kit' ).terminal; var progressBar; var progress = 0; function updateProgress() { // 產生一個隨機的進度值 progress += Math.random() / 10; progressBar.update(progress); // 檢查是否完成 if (progress >= 1) { setTimeout(function() { terminal('\n'); process.exit(); }, 250); } else { setTimeout(updateProgress, 100 + Math.random() * 500); } } progressBar = terminal.progressBar({ width: 80, title: 'Downloading file:', eta: true, percent: true }); updateProgress();
上面的代碼會產生下面這種效果:
validator
能夠幫你進行一系列常見的字符串驗證(例如:電子郵件地址、電話號碼、IP地址等)。每當你從用戶那裏得到輸入時,這樣的軟件包都是必不可少的。用戶會犯錯誤,並會在文本框中輸入一些很是奇怪的東西,因此須要一個驗證輸入的包,避免數據損壞或服務器崩潰。
如下是一些經常使用的驗證器:
isEmail(str [, options])
isIP(str [, version])
isMobilePhone(str, locale)
isURL(str [, options])
validator
也提供檢測器,能夠對輸入字符串進行規範化、刪除或轉義。例如對用戶提交的內容進行清理,避免他們輸入惡意的 HTML 或 JavaScript 代碼。
下面是經常使用的檢測器:
blacklist(input, chars)
escape(input)
normalizeEmail(email [, options])
whitelist(input, chars)
normalizeEmail()
方法它可以確保電子郵件地址都是小寫字母,甚至能夠刪除須要忽略的字符。假設你有電子郵件 abc.def+ghi@163.com
,normalizeEmail()
會將其標準化爲 abcdefghi@163.com
。
formidable 能夠幫你處理文件上傳的每一個步驟,包括 multi-part 解析器、把文件寫入磁盤以及錯誤處理等。這是我最喜歡的一個包,若是你不想從新發明輪子能夠試一試。
下面是一個在普通 HTTP 服務器上使用 formidable
的例子,代碼是從包自己中給出的示例修改而來的:
var http = require('http'); var util = require('util'); var formidable = require('formidable'); var path = require('path'); var PORT = 8080; var root = path.join(__dirname, '../'); exports.dir = { root : root, lib : root + '/lib', fixture : root + '/test/fixture', tmp : root + '/test/tmp', }; var server = http.createServer(function(req, res) { if (req.url == '/') { res.writeHead(200, {'content-type': 'text/html'}); res.end( '<form action="/post" method="post">' + '<input type="text" name="title"><br>' + '<input type="text" name="data[foo][]"><br>' + '<input type="submit" value="Submit">' + '</form>' ); } else if (req.url == '/post') { var form = new formidable.IncomingForm(), fields = []; form .on('error', function(err) { res.writeHead(200, {'content-type': 'text/plain'}); res.end('error:\n\n' + util.inspect(err)); }) .on('field', function(field, value) { console.log(field, value); fields.push([field, value]); }) .on('end', function() { console.log('-> post done'); res.writeHead(200, {'content-type': 'text/plain'}); res.end('received fields:\n\n ' + util.inspect(fields)); }); form.parse(req); } else { res.writeHead(404, {'content-type': 'text/plain'}); res.end('404'); } }); server.listen(PORT); console.log('listening on http://localhost:' + PORT + '/');
shelljs
是一個可以讓你在任何系統上使用通用的Unix命令的包,不論是 Windows、Linux 仍是 Mac。這樣你就不用再爲項目分別編寫 bash 和批處理腳本。 shelljs 提供了相似 Unix 的環境,若是你須要編寫腳原本運行測試、提交代碼或在服務器上啓動,則只需編寫一次便可。
能夠用命令執行相似操做:
require('shelljs/global'); ls('*.js').forEach(function(file) { sed('-i', 'BUILD_VERSION', 'v2.0.3', file); sed('-i', /.*REMOVE_THIS_LINE.*\n/, '', file); sed('-i', /.*REPLACE_THIS_LINE.*\n/, cat('macro.js'), file); });
執行常見命令:
require('shelljs/global'); mkdir('-p', 'release/data'); cp('-R', 'data/*', 'release/data');
檢查可用的二進制文件:
require('shelljs/global'); if (!which('git')) { echo('This script requires git!'); exit(1); }
甚至能夠像在 bash 腳本中同樣運行命令:
if (exec('git commit -am "Release commit"').code !== 0) { echo('Error: Git commit failed!'); exit(1); }
你還知道有哪些好用的包?請在評論留言。