本文根據工作筆記整理而成,將覆蓋Node.js基礎、使用Express、使用Websockets協議、單頁面應用框架等內容。本節的目的,是使用Vs2012開發node.js應用,這個很好理解,是懶於使用太多的命令行、使用習慣的IDE、使用習慣的Tfs項目管理及源碼版本管理。既然WebMatrix可以做到,Vs2012當然沒有理由不能做到。請牢記這只是開發方式的問題,我們顯然不准備在部署的時候,使用IIS來運行Node.js應用。因此工作的目標包括:
1、弄清Vs2012里運行Node.js應用的機制
2、手工的配置最新版的Node.js,以加深理解。
3、弄清在vs2012中有無可能調試Node.js代碼。
一、Node.js的優勢何在?
1、使用javascript撰寫服務端:這樣的好處,首先是人為的降低了Web程序員的技能門檻,其次前后端通過json格式的交互是完全一致的。
2、非阻塞模式:到目前為止,所有的Web服務器比如iis、apache,均為每個請求建立一個進程,無狀態工作,假設每個請求需要2m左右的內存,8G的物理內存可同時處理多少請求,這個大家能簡單推算。Node.js使用單一進程,通過監聽端口,異步處理所有Web請求,不再為每個請求創建單獨的進程,這對並發是有利的。
3、服務端解釋執行:因為使用Google的javascript V8引擎,速度較快。
4、與Node.js無關的:WebSockets協議支持,這對於廣播類、服務器推送類的應用非常合適。
我個人對此非常有興趣,是因為快、輕、易。快:性能不錯,大家可以體驗一下https://trello.com/ 這時一個有名的團隊協作、流程管理應用,服務器在國外,看看其響應速度。輕:目前的0.81版本,windows下的安裝程序不過4M,不需要其他、甚至不需要iis之類。易:Web程序員無論做服務端、前端開發,幾乎沒有不熟悉javascript的,很容易入門,Asp.net程序員需要掌握什么?html、css、javascript、C#或其他編程語言,對於node.js程序員來說,只需要前面的三項。
二、創建項目:[2012年11月10日 預期20分鍾,15:02開始15:25結束 中斷0分鍾 共23分鍾]
安裝WebMatrix2之后,node.js得0.62版本,安裝在C:\Program Files (x86)\nodejs,同時iisnode的0.14版本,安裝在C:\Program Files (x86)\iisnode-dev
我們首先用WebMatrix2創建一個Node.js的空白網站。
這里要注意,我們首先在E:\目錄下創建一個Vs2012的解決方案NodeBase,這將創建E:\NodeBase目錄,NodeBase.sln文件存放在該目錄。以Webmatrix的操作方式,我們在文件|選項中更改默認網站位置為E:\NodeBase,之后創建的網站名為NodeBase,實際存放在E:\NodeBase\NodeBase目錄下。我們將該網站加入到解決方案,然后添加到源代碼管理。
此時我們正常的運行,可以看到輸出的”hellow world“,當然,一時手癢將server.js里輸出的內容改為"你好,Node.js",再運行,出現亂碼。此時我提交三個問題,准備依次解決。
三、中文亂碼問題[2012年11月10日 預期30分鍾,15:25開始15:39結束 中斷0分鍾 共14分鍾]
簡單的在Google上搜索 Node.js 亂碼,兩個步驟解決:
1、將server.js保存為utf8:
由於server.js並非utf8文件,則res.end並未將字符串作utf8解析,因此,需要將js文件保存為utf8編碼。方法是:文件|高級保存選項,然后選擇
編碼"UniCode(utf8 無簽名) 代碼頁65001"。
2、修改代碼,輸出utf8:
res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf8' });
res.end('你好 ,Node.js!');
四、將Node.js網站加入Vs2012網站,配置文件是否修改了?[2012年11月10日 預期30分鍾,15:40開始15:55結束 中斷3分鍾 共12分鍾]
配置文件未做任何更改。比較是否更改了配置文件,采用如下的方法:我們將預先拷貝的副本中的Web.config文件,全部復制、粘貼到項目中的Web.config文件,然后使用源碼管理的比較差異功能,與服務器版本比較。發現沒有任何差異,再使用源碼管理中的撤銷掛起的更改功能,恢復原狀。
五、Vs2012何以能運行Node.js網站?[2012年11月10日 預期30分鍾,15:55開始16:30結束 中斷2分鍾 共33分鍾]
在配置文件中,在<handlers>節有如下語句:<add name="iisnode" path="server.js" verb="*" modules="iisnode" />。由此向iisexpress指明,使用iisnode模塊來處理server.js。我們可以在iis的"模塊"里,發現iisnode模塊。因為我們安裝了webmatrix,那么相應的也安裝了iisnode,在webmatrix中創建node項目的時候,這些配置也就由項目模版提供。隨WebMatrix 2安裝的iisnode在C:\Program Files (x86)\iisnode-dev,是0.14版。
這里的探究很單純,由web.config找到使用的工具,由搜索iisnode找到其官網,在C盤搜索iisnode的文件夾位置。
六、更新Node.js和IISNode到最新版本[2012年11月10日 預期60分鍾,20:30開始23:20結束 中斷5+2分鍾 共163分鍾]
在我們安裝最新版的Node.js合iisnode的時候,我們在控制面板|程序和功能 里,找到node.js和iisnode
我們將首先刪除掉node.js,在C:\Program Files (x86)\nodejs 里,查看node.exe為0.62版,最新版本為0.81
卸載的過程中,提示Google V8引擎不能自動的關閉,我們停止iis express里剛剛運行的網站,正常的卸載。然后,重新運行我們的網站,此時提示:the iisnode module is unable to start the node.exe process.Make sure the node.exe executable is available at the location specified in the system.webServer/iisnode/@nodeProcessCommandLine element of web.config. By default node.exe is expected to be installed in %ProgramFiles%\nodejs folder on x86 systems and %ProgramFiles(x86)%\nodejs folder on x64 systems.
當然,這正說明我們刪除的,就是運行所需的。
我們可以在iis管理界面中查看iisnode模塊,找不到。
我們在C:\Users\Administrator\Documents\IISExpress\config中,注意不是C:\Program Files (x86)\IIS Express\config,找到applicationhost.config文件,在里面搜索iisnode,找到:<add name="iisnode" image="C:\Program Files (x86)\iisnode-dev\release\x86\iisnode.dll" /> ,而在modules配置節能找到<add name="iisnode" /></modules>,此處顯然注冊了iisnode模塊,其路徑在上面說明了。
iisexpress安裝目錄下的appcmd.exe和IisExpressAdminCmd.exe,實際上是用來修改配置文件的。我們沒有改變默認的存儲在我的文檔下的配置文件applicationhost.config,團隊開發中,使用統一的配置文件並加入源碼版本庫,我們需要:
1、使用命令行方式來啟動 iisexpress /config:<配置文件路徑>
2、使用VS的“附加到進程”調試。
不過,這可能十分多余,因為我們對網站的設置,可以完全基於web.config,不對iis的配置文件做改動,我們可以忽略它。
好,接下來,考慮到iisnode和node.js版本的兼容性問題,我們首先安裝新版的node.js來對應舊版的nodeiis。運行,仍然出現上面的錯誤提示。當然,安裝x64版本后,node.js出現在C:\Program Files\nodejs目錄,按上面錯誤提示....x64系統期望安裝在 %ProgramFiles(x86)%\nodejs。我們簡單的將新安裝的nodejs整個目錄拷貝到C:\Program Files (x86),以此欺騙iisnode
成功的運行。
繼續下一步,我們將卸載iisnode,此時我們應觀察iisexpress里的iisnode模塊的配置信息,是否同時被卸載。
我們在控制面板|程序和功能 中找到iisnode for iis7.x dev package,這顯然是WebMatrix 2同時安裝的,腹誹一下,用的是開發版而非穩定版。
再運行,彈出錯誤提示窗口,曰:無法連接到已配置的開發Web服務器。我們再打開一個正常的asp.net mvc的網站項目,悲劇,同樣無法運行,提示:無法啟動IIS Express Web服務器。
理由,當然昭然若揭:我們卸載了iisnode,但iis express的配置文件中,已經注冊了iisnode模塊。啟動的iis express時,本應啟動的模塊不能啟動,索性整個都不動了。
為了確認一下,我們重新啟動機器,問題仍然存在,iis express完全不動矣.....
回過頭來,再看看個人的iis express配置文件,iisnode得信息仍在,說明雖然卸載iisnode,但卸載過程留下了尾巴。我們先備份這個文件,然后手工去掉iisnode的配置信息。一共三處,干掉他們。
好,普通的asp.net mvc程序可以運行了,不過,運行我們的node.js項目,理所當然的出現錯誤:HTTP 錯誤 500.21 - Internal Server Error,處理程序“iisnode”在其模塊列表中有一個錯誤模塊“iisnode”。我們在web.config項目中,設定了用iisnode來響應對server.js的請求。現在iisnode沒了,自然不能運行。
現在我們安裝0.2版的iisnode,嗯,號稱支持websocket、甚至支持調試、修復了一些Bug。安裝時候現很搞笑的問題:要求安裝vc2012的運行時,本機顯然安裝過vs2012、包括C++。那么,很容易想到,是語言問題:在英文的下載頁面下載英文版本的vc2012 x64運行時,才能正常安裝。安裝后情況不變。這也是正常的.....我們檢查iis express的個人配置文件,沒有自行加上iisnode的配置。但我們在iis管理工具中,發現新增加了iisnode模塊。好吧,我們現在按照先前的備份,手工在配置文件里增加iisnode模塊。
將C:\Program Files (x86)\iisnode-dev\release\x86\iisnode.dll 替換為:"C:\Program Files\iisnode\iisnode.dll",錯誤
現象不變---iis express未關閉,配置文件尚未起作用。
關閉之后,老問題又出現了:無法連接到已配置的開發Web服務器。
此時,折騰1小時左右,突然.....回過頭來,是否下載的版本有誤?
iisnode for express沒有x64版本,所以先前忽略---卸載先前版本,改用0.20的for express x86版本,當然又需要重新安裝Visual C++ Redistributable for Visual Studio 2012 的英文x86版本,
在這里下載:http://www.microsoft.com/en-us/download/details.aspx?id=30679
終於運行正常,但這個簡單的版本問題,導致所需時間,遠遠超出預期。
再看看iis express的個人配置文件,自動的配置為 <add name="iisnode" image="C:\Program Files (x86)\iisnode-express\iisnode.dll" />
這意味着使用express版本,這些配置都是安裝程序的工作。當然,我們在最后階段的折騰,對於理解iisnode背后的工作機制,大有幫助。