一些我更願意在開始就知道東西利用 Node.js 開發是一個很是有趣,和使人知足的過程, 它有3萬多個模塊能夠選擇使用,而且全部的模塊能夠很是容易的集成入現有的應用之中。
不管如何,對於一些剛開始使用Node.js 開發的的人來講, 很容易碰壁,在這個文章中,我會提到在你學習過程當中遇到的問題。
貼士 1: 在開發環境使用 nodemon, 在生產環境使用pm2
當你第一次開發Node.js應用的時候, 其中一件事情就是一次又一次的運行[file].js 就和揭傷疤同樣。 當我第一次開發的node app時候,這個讓我感到異常挫敗和痛苦, 尤爲是每當我修改很小東西的時候須要control+c
幸運的是我發現了一個很是棒的工具Nodemon。 你能夠利用如下的命令來安裝javascript
npm install -g nodemonjava
複製代碼node
Nodemon 是一個使人驚歎的工具, 當你全局安裝它之後, 能夠經過 nodemon [file].js 來啓動你的node.js scripts,它會告訴nodemon來監視你的script和scripts的全部變化, 這樣的Node.js開發方式很是震撼以及讓大大提升開發速度。
那麼,生產環境又如何, 除非你用了heroku,Nodejitsu或者其它一些好的 Node.js 平臺(也許它們有相似的功能), 可是碰巧你用了EC2 或者一些其它的雲平臺來運行你的Node.js app, 你如何能然保證這是一個始終運行的Node.js app
案就是PM2, PM2 是一個相似於Nodemon的工具,不一樣之處在於它用於生產環境, 和Nodemon類似的地方在於它會監控你的app的任何修改或者從新部署,可是有更好的一面, PM2 在遭遇到崩潰的時候,它會正確重啓你的app。
PM2的優勝之處在於當你要將app須要多核處理的時候,PM2內部集成的負載均衡可讓你很容易的去指定運行多少個實例。git
pm2 start app.js -i maxgithub
複製代碼web
-i參數目的是指定運行多少個實例,在這個例子中 PM2 使用了一個常量max來擴展你的app運轉到你最大的核數,不要忘記Node 平時只會運行在單核!
貼士 2: Async 或者 Q
當你專一於寫了更多的node.js apps的時候,你確定領略了什麼是回調地獄。 若是你還不知道,這裏有一個例子:redis
function register(name, password, cb){
chrome
checkIfNameExists(name, function(err, result){
npm
if(err){
json
return cb(「error」);
}
checkIfPasswordGood(password, function(err, result){
if(err){
return cb(「error」);
}
createAccount(name,password, function(err,result){
if(err){
return cb(「error」);
}
createBlog(name, function(err, result){
sendEmail(name, function(err, result){
callback(result);
});
});
});
});
});
}
複製代碼
這顯然不是一個有用或者使人折服的代碼, 反而進入一種回調地獄般兩難的境地,是你的話將如何避免
一個簡單的辦法是使用events, 可是我我的不建議這麼作,由於使用events來調用只有一個用途的私有方法,足以使人受挫
因此你該怎麼作 這裏有兩個編譯好的模塊,async.js和Q, 它們兩個均可以防止落入回調地獄
Async.js或者 ‘async’ 讓你能夠容易的執行一些連續或者平行的任務,在不依賴一個又一個的嵌套循環前提下。
下面是一些來自Async的readme,寫明瞭它支持的模式, 如需獲取所有的支持方式請去它們的github主頁查看。
async.map([‘file1',’file2',’file3'], fs.stat, function(err, results){
// results is now an array of stats for each file
});
async.filter([‘file1',’file2',’file3'], fs.exists, function(results){
// results now equals an array of the existing files
});
async.parallel([
function(){ … },
function(){ … }
], callback);
async.series([
function(){ … },
function(){ … }
]);
async.waterfall([
function(callback){
callback(null, ‘one’, ‘two’);
},
function(arg1, arg2, callback){
callback(null, ‘three’);
},
function(arg1, callback){
// arg1 now equals ‘three’
callback(null, ‘done’);
}
], function (err, result) {
// result now equals ‘done’
});
複製代碼
若是咱們用async的waterfall來修改以前的例子,結果將更加容易閱讀, 不再用讓你的代碼看起來像一個死亡金字塔。
另外一個重要的庫叫作Q。 這個庫是一個暴漏promises的概念, Promise 是一個含有’promise’方法的返回對象,它提供了一個最終的返回值,很是優雅的將javascripts的異步和node.js緊密聯繫在一塊兒。
For example, taken from Q’s repo page.
promiseMeSomething()
.then(function (value) {
}, function (reason) {
});
複製代碼
這個 promise me 方法 正確返回了一個對象, 對象將在傳入value的時候調用這個方法當,而且它提供了一個額外的callback來處理失敗後的返回值
這是一個很是有條理的方式來避免回調地獄,若是你重寫咱們以前的那個例子,你能夠很是容易的讓這些函數正確被調用並執行。
就和我以前說的同樣, 我很不肯建立只有一個用途的一堆功能,相反的在’then’以後傳入一個方法名,僅僅建立了一個匿名的內部功能和傳遞,固然了選擇權始終在你手裏。
總的來講,當你落入回調地獄的時候,是時候去看看 async.js或者Q吧。
個人選擇 固然是 Q
貼士 3: 輕鬆調試 Node.js apps
若是你從一個IDE重度集成的語言好比java 或者C# 轉來調試Node.js, 你必定會感到很困擾, 大部分新加入node的開發者採用了’flow’的調試模式,從這一刻開始你最好的朋友就是console.log
可是依然有更常見的調試方式來代替, Node.js 內置了一個調試器你能夠稱爲 node debug, 不過我更喜歡的 node-inspector
它們的github說 「Node Inspector 是一個使用Blink Developer Tools (之前稱爲WebKit Web Inspector)node.js調試器的界面,」簡而言之,node-inspector 可讓你用任何你想用的編輯器和chrome web tools來調試你的應用,這是多麼的性感。
Node-inspector 可讓你作一些很是酷的事情,好比實時修改,單步調試,注入以及一堆其它很是酷的東西。
讓咱們來根據指示一步一步安裝
https://github.com/node-inspector/node-inspector
貼士 4: Nodefly
一旦你有你的應用程序正常運行,你可能會問本身,你怎麼能夠監視它的性能和配置文件,以確保您的應用程序運行在最佳的速度。最簡單的答案是一個卓越的服務,我稱爲Nodefly。
用簡單的一行代碼Nodefly開始監視你的應用程序內存泄漏,測量redis用了多久,mongo查詢和一堆其它很酷的東西。http://www.nodefly.com
貼士 5: 利用NPM進行模塊管理
Node作最多見的事情之一是經過NPM安裝軟件包。Node有一個驚人的包管理器安裝全部指定在你的package.json的manifest文件中的模塊。然而,全部初學者都會碰上保持的package.json文件中您所使用的全部的模塊都是最新版。
這彷佛是一個痛苦的過程,老是打開的package.json來更新新模塊的依賴,但許多人不知道的是npm會爲你作這個!
很是簡單運行 npm install – save module_name 而後 npm將自動更新你的package.json 包含正確的模塊和版本,
npm install - save module_name
複製代碼
貼士 6: 不要檢查node_modules 文件夾
雖然咱們的話題一直是modules和npm,可是並非不是不少人都知道,你不該該提交node_modules文件夾。這背後最大的緣由是,沒有必要提交這個文件夾。只要有人下載你的代碼,它們可經過運行NPM來安裝和下載全部須要的模塊。
您可能會說,它是否是一個大問題,若是檢查node_modules,可是,若是下載代碼的人使用了和你編譯modules不同的操做系統的來安裝經過NPM?你的應用程序將會崩潰,下載代碼的人將不知道爲何會如此!
舉個例子bcrypt以及sentimental若是當在您安裝在主機系統上編譯它們,由於它們用了本地C語言組件來編譯。避免檢查node_modules文件夾的方式是加入.gitignore
// .gitignore node_modules/*
複製代碼
貼士 7: 別忘記返回
初學者常常犯一個很常識的錯誤,就是忘記callback後的返回值,雖然有些時候,這沒有影響,有不少時候,你會遇到奇怪的問題,由於你的回調被調用兩次。
讓咱們看一個簡單的例子
function do(err,result, callback){
if(err){
callback(「error」);
}
callback(「good」);
}
複製代碼
乍一看,這個片斷是有道理的。若是有錯誤,在回調中發送「錯誤。若是不發送return,調用callaback後這個函數不會停下來。它只是將移動到調用回callback(「good」)。這樣作在長期和複雜的代碼行裏面會節省幾個小時的調試。