絕大多數對Node.js的討論都把關注點放在了其處理高併發的能力上。簡單來講,相比其餘同類解決方法,Node框架給開發這提供了構建高性能網絡應用的強大能力,固然,開發者要明白Node內部所做出的權衡,以及Node構建應用之因此性能好的緣由。html
由於Node採用一個長期運行的進程,每一個請求共享這個進程,當這個變量被回調函數修改以後,結果就會改變。如PHP的Apache會產生出多個線程(每一個請求對應一個線程),每次都會刷新,內部變量等就會從新賦值。因此對回調函數修改當前內存中的變量必定要很是當心,還要注意對錯誤的處理是否會潛在的修改這些狀態。node
當ajax同步處理的時候,必須等待服務器響應並返回頁面,才執行後續語句,這就是阻塞。Node.js採用了事件的輪詢,事件輪詢是非阻塞的。ajax
什麼是事件的輪詢,Node會註冊一個事件,掛到任務隊列中,而後不斷的詢問內核事件是否分發,當事件分發以後,就會觸發該事件的回調函數,而後繼續執行下去,若是沒有分發,就會繼續執行後續的語句。服務器
console.log('hello'); setTimeout(function(){ console.log('world'); }, 500); console.log('bye'); //輸出 //hello //bye //world
若是想了解更多的運行機制,單線程,看大佬的文章:http://www.ruanyifeng.com/blog/2014/10/event-loop.html網絡
一個Http請求中,若是某個回調函數發生錯誤,整個進程都會遭殃,由於錯誤沒有被捕獲,進程的狀態就不肯定。以後就可能沒法正常工做,而且若是錯誤始終不處理的化,就會一直拋出意料以外的錯誤,這樣很難調試。併發
爲何try/catch 不會捕獲異常呢,由於異步機制,當異步時,catch代碼塊已經執行事後,異步的代碼纔開始執行,一但出現錯誤,就不會被捕獲到。這時候就會觸發uncaughtException事件,直接終止當前棧,結果會致使全部用戶終止鏈接。框架
處理方法參考:http://www.infoq.com/cn/articles/quit-scheme-of-node-uncaughtexception-emergence/異步
絕大部分Node異步API接受回調函數,第一個參數都是錯誤對象或者null;函數