使用webStrom調試pomelo

原文地址: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文件中通過配置的各個服務器進程。其中,你看到的idhostport等等都是子服務器的啓動參數,這些參數都會放到啓動命令行中app.js的後面。github

  • 再次,Pomelo的設計人員最初已經考慮到了直接在nodeapp.js前添加參數的簡便方法:在服務器配置文件中,配置條目中插入"args": " 你想要的參數 "後,即可以你指定的參數運行nodeweb

修改配置以啓動帶有調試模式的服務器

1、打開文件

打開game-server/config/servers.json。爲了便於便於開發,咱們將服務器數目縮減至每功能1個運行實例。這樣你就會看到:json

精簡過的默認服務器配置

2、修改並保存

咱們對gate服務器的負載分配原理產生了興趣,想要調試它。這時,咱們只須要在{"id": "gate-server-1", ...的行末,花括號}前,插入下面代碼, "args": " --debug=32312 "。使gete服務器的配置組變成這樣:瀏覽器

gate服務器調試配置

當再次啓動服務器時,master服務器會讀取新的配置,並以這個配置運行gate-server-1服務器。服務器

而該服務器的進程,會監聽32312端口,以便調試器鏈接。將端口設置的偏高是爲了減小端口衝突的可能性。開發過程當中,若是啓動後發現有報ADDRINUSE(端口已被佔用)的錯誤,請使用pomelo kill --force殺光Pomelo程序,並調整此處的端口值。網絡

配置IDE的調試器

1、打開Edit Configurations...對話框

能夠從運行、調試按鈕前面的小三角進入,或者從工具欄中選擇Run - Edit Configurations...app

打開Edit Configurations對話框

2、新增一條Node.js Remote Debug

增長 Node.js Remote Debug 配置

gate study 調試器配置

Name欄名字能夠隨意起,但最好選擇明確易懂的。而後選中Single instance only,這樣只會啓動一個調試器。而不會有不少相同的調試器都連到後面指定的調試端口。

下面的Host本地127.0.0.1Debug Port填入剛剛上面指定的端口號,我這裏用32312,與前面配置文件中的徹底一致。Local directory指定當前的game-server/app.js目錄所在目錄。

附:運行配置

固然你可能已經注意到了,這裏的Configurations不只包含調試,還包括運行配置。運行配置方法跟通常的NodeJS程序配置方法相同。NodeJS新人能夠參考圖片中配置。注意被框的內容。

game-server 及 web-server 運行配置舉例

準備調試

1、分別啓動Web、Chat服務器

若是你有作過運行Chat和Web服務器的配置,如今就能夠從運行、調試按鈕前面的配置下拉菜單中,分別選擇Chat以及Web後,點擊[►]運行按鈕。運行後,能夠從IDE下方的控制檯輸出中查看日誌輸出,能夠檢查一下這兩個服務器的啓動是否成功。若是出現紅字,多半表示啓動失敗。你能夠根據提示的報錯信息Google或者 提交Issue ,以查找解決方案。

運行、調試配置選擇

2、鏈接調試器

再從配置下拉菜單中選擇剛剛的調試配置gate study,以後點擊[☼]調試按鈕。檢查窗口下方的Debugger,能夠看到有提示說Connected to 127.0.0.1:32312

調試器已鏈接

3、設置斷點

因爲咱們想調試gate服務器中,與connector分配相關的代碼,因此在IDE中,打開app/servers/gate/handler/gateHandler.js。定位到 第30行 ,在此處下一個斷點。

gateHandler.js 中的斷點

實踐

瀏覽器中打開 http://127.0.0.1:3001/index.html 會看到 Chat of Pomelo標題的登陸頁面。填入兩欄表單後,點擊【JOIN】按鈕。

Chat Of Pomelo 登陸頁

此時,頁面將不會作出任何反應,是由於服務器端的代碼被斷點攔下了。而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.hostres又來自connectorsconnectors來自配置文件。

game-server/config/servers.jsonconnector服務器的 配置條目 ,能夠清楚的看見"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")的方法及代碼,來完成一個代理工具。以便調試部署在遠端服務器上運行的代碼。

相關文章
相關標籤/搜索