調試技術與開發技術構成了軟件開發的基石。目前Nodejs做爲新型的Web Server開發棧倍受開發者關注。總的來講Nodejs的應用程序主要有兩部分:JavaScript編寫的js模塊和C語言編譯的二進制模塊。這裏主要介紹三種avaScript模塊的調試方法:基於Nodejs內建的調試器,基於V8調試插件和基於Chrome瀏覽器的調試器。如下全部的操做都將基於以下代碼(example.js):html
var http = require('http');
var url = require('url');
http.createServer(function (req, res) {
var path = url.parse(req.url).pathname;
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(path);
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');
1. 基於Nodejs內建的調試器node
Nodejs提供了一個內建調試器來幫助開發者調試應用程序。想要開啓調試器咱們須要在代碼中加入debugger標籤,當Nodejs執行到debugger標籤時會自動暫停(debugger標籤至關於在代碼中開啓一個斷點)。代碼以下:web
var path = url.parse(req.url).pathname;
debugger;
res.writeHead(200, {'Content-Type': 'text/plain'});
執行命令:node debug example.js 就能夠進入調試模式。npm
在debug模式下,可使用內建命令如repl去評估變量和表達式的值(如2所示)。咱們也能夠經過help命令來獲取完整的調試命令列表。瀏覽器
Commands: run (r), cont (c), next (n), step (s), out (o), backtrace (bt), setBreakpoint (sb), clearBreakpoint (cb),
watch, unwatch, watchers, repl, restart, kill, list, scripts, breakpoints, versionwebsocket
2. 基於V8插件的調試器
Nodejs是基於google V8的引擎上構建的,Google爲Eclipse提供了一個對應的調試插件。關於如何在Eclipse中安裝和調試Nodejs程序就再也不重複描述了,網上已經有不少的文章了(具體能夠參考這篇文章http://cnodejs.org/blog/?p=911)。惟一要注意的是在默認狀況下V8引擎支持的調試模式是本地模式。若是想要開啓遠程調試的話,咱們須要修改Nodejs中的V8源文件:/deps/v8/src/platform-posix.ccsocket
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); --> INADDR_ANY
addr.sin_port = htons(port);
而後從新編譯Nodejs。post
提示:ui
用插件來調試nodejs程序,你有時候會遇到什麼connect refuse, get version failed等等錯誤。那麼請注意你使用的ip的地址, 通常下127.0.0.1的迴環地址是都工做的。若是你使用真實的ip地址,請檢查防火牆設置。google
3. 基於Chrome瀏覽器的調試器
既然咱們能夠經過V8的調試插件來調試,那是否也能夠借用Chrome瀏覽器的JavaScript調試器來調試呢?node-inspector模塊提供了這樣一種可能。咱們須要先經過npm來安裝node-inspector
npm install -g node-inspector // -g 導入安裝路徑到環境變量
node-inspector是經過websocket方式來轉向debug輸入輸出的。所以,咱們在調試前要先啓動node-inspector來監聽Nodejs的debug調試端口。
默認狀況下node-inspector的端口是8080,能夠經過參數--web-port=[port]來設置端口。在啓動node-inpspector以後,咱們能夠經過--debug或--debug-brk來啓動nodejs程序。經過在瀏覽器輸入http://[ip address]:8080/debug?port=5858,咱們會獲得以下的調試窗口:
這三種方法各自有優缺點,我我的比較欣賞node-inspector的方式。