原文地址:http://nodejs.netease.com/topic/515251b97f53b3d3330025c7html
轉自 [ETiV][1]
使用駕輕就熟的IDE來開發應用程序,可使咱們的工做事半功倍。而調試則更可讓咱們準確的定位BUG,發現問題。
本文講述如何使用 WebStorm 這個怪獸級JavaScript IDE來調試 Chat of Pomelo。
若是你更喜歡 Eclipse 等其餘IDE,但願本文也能夠有一些幫助。node
* 首先咱們須要知道,NodeJS應用程序能夠在運行命令中加入--debug=5858
參數,可使得NodeJS程序監聽本地5858
端口,並開啓調試模式。git
其次,Pomelo的運行原理是:pomelo start
時,啓動了master
服務器,而後其先讀取配置文件,再啓動由game-server/config/servers.json
文件中通過配置的各個服務器進程。其中,你看到的id
、host
、port
等等都是子服務器的啓動參數,這些參數都會放到啓動命令行中app.js
的後面。github
再次,Pomelo的設計人員最初已經考慮到了直接在node
後app.js
前添加參數的簡便方法:在服務器配置文件中,配置條目中插入"args": " 你想要的參數 "
後,即可以你指定的參數運行node
。web
打開game-server/config/servers.json
。爲了便於便於開發,咱們將服務器數目縮減至每功能1個運行實例。這樣你就會看到:json
咱們對gate
服務器的負載分配原理產生了興趣,想要調試它。這時,咱們只須要在{"id": "gate-server-1", ...
的行末,花括號}
前,插入下面代碼, "args": " --debug=32312 "
。使gete
服務器的配置組變成這樣:瀏覽器
當再次啓動服務器時,master
服務器會讀取新的配置,並以這個配置運行gate-server-1
服務器。服務器
而該服務器的進程,會監聽32312
端口,以便調試器鏈接。將端口設置的偏高是爲了減小端口衝突的可能性。開發過程當中,若是啓動後發現有報ADDRINUSE
(端口已被佔用)的錯誤,請使用pomelo kill --force
殺光Pomelo程序,並調整此處的端口值。網絡
Edit Configurations...
對話框能夠從運行、調試按鈕前面的小三角進入,或者從工具欄中選擇Run
- Edit Configurations...
。app
Node.js Remote Debug
Name
欄名字能夠隨意起,但最好選擇明確易懂的。而後選中Single instance only
,這樣只會啓動一個調試器。而不會有不少相同的調試器都連到後面指定的調試端口。
下面的Host
寫本地127.0.0.1
,Debug Port
填入剛剛上面指定的端口號,我這裏用32312
,與前面配置文件中的徹底一致。Local directory
指定當前的game-server/app.js
目錄所在目錄。
固然你可能已經注意到了,這裏的Configurations
不只包含調試,還包括運行配置。運行配置方法跟通常的NodeJS程序配置方法相同。NodeJS新人能夠參考圖片中配置。注意被框的內容。
若是你有作過運行Chat和Web服務器的配置,如今就能夠從運行、調試按鈕前面的配置下拉菜單中,分別選擇Chat
以及Web
後,點擊[►]運行按鈕。運行後,能夠從IDE下方的控制檯輸出中查看日誌輸出,能夠檢查一下這兩個服務器的啓動是否成功。若是出現紅字,多半表示啓動失敗。你能夠根據提示的報錯信息Google或者 提交Issue ,以查找解決方案。
再從配置下拉菜單中選擇剛剛的調試配置gate study
,以後點擊[☼]調試按鈕。檢查窗口下方的Debugger
,能夠看到有提示說Connected to 127.0.0.1:32312
。
因爲咱們想調試gate
服務器中,與connector分配相關的代碼,因此在IDE中,打開app/servers/gate/handler/gateHandler.js
。定位到 第30行 ,在此處下一個斷點。
瀏覽器中打開 http://127.0.0.1:3001/index.html 會看到 Chat of Pomelo
標題的登陸頁面。填入兩欄表單後,點擊【JOIN】按鈕。
此時,頁面將不會作出任何反應,是由於服務器端的代碼被斷點攔下了。而IDE會由於調試器而被激活:
下方窗口中,除了常規調試用到的StepOver、StepInto、StepOut等必須功能外,有不少好用的工具,好比即時表達式求值、切換異常發生時自動中斷……這裏就不深刻探討了。
Web服務器啓動成功後咱們能夠看到它提示說能夠訪問http://127.0.0.1:3001/index.html
了。但咱們都知道127.0.0.1是本機IP地址,若是真正要跟其餘人「聊天」的話,這樣是不行的。由於別人不必定能打開127.0.0.1:3001,即使打開了,也沒法跟你在一塊兒聊天。
因此將這裏的127.0.0.1換成你本身電腦的可被網絡上其餘成員訪問到的地址,我這裏的地址是192.168.1.61
。OK,我能夠在瀏覽器裏打開http://192.168.1.61:3001/index.html
,由於本機調試沒有任何問題,因此我也信心滿滿的將這個地址告訴了與我同一網絡的同事。
這時出現了一個問題,我本身能夠登陸到聊天界面,而其餘任何人都沒法登陸。
根據其餘人的瀏覽器Console輸出,能夠看到他們都鏈接一下192.168.1.61:3014
端口後,又去鏈接127.0.0.1:3050
,因此他們纔沒法登陸的。
而3014
端口恰好是gate
服務器,問題就出在這裏,仍是繼續調試一下吧。
在通過一番斷點切換後,能夠發現gateHandler.queryEntry
最後跑到了 第39行 的 next
函數上。
var res = dispatcher.dispatch(uid, connectors); next(null, { code: 200, host: res.host, port: res.clientPort });
能夠看到,返回內容的 host
使用了res.host
,res
又來自connectors
,connectors
來自配置文件。
而game-server/config/servers.json
下connector
服務器的 配置條目 ,能夠清楚的看見"host":"127.0.0.1"
。
源頭找到了,馬上將這裏的127.0.0.1
所有替換成我本機192.168.1.61
。而且重啓Chat
服務器。
同事再刷新訪問的時候,即可以登陸進來了。
細心的人或許發現,調試器鏈接的IP地址,是127.0.0.1,但你或許在想,既然是叫"Remote Deubgger",應該能夠鏈接除127.0.0.1
之外的IP吧?
我也是這麼想的。可是,在不借助其餘工具的狀況下,不能辦到。
就是說,不借助一個代理工具,是沒辦法鏈接到除了127.0.0.1
地址的調試端口的。
你能夠藉助NodeJS官方 Wiki 文章結尾(Ctrl-F後,搜索"You probably noticed")的方法及代碼,來完成一個代理工具。以便調試部署在遠端服務器上運行的代碼。