本文根据工作笔记整理而成,将覆盖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背后的工作机制,大有帮助。