架一个HTTP服务——Node.js摸石头系列之二
系列目录:Node.js摸石头系列目录
摸石头就是摸着石头过河的意思。Node.js 正在快速发展,有广阔的应用前景,不过文档和参考资料也不是十分完备。这个系列其实就是我的读书笔记了。我学习的方式基本上是鲸吞和试验两大法宝。这两个法宝很有效,但同时也耗费很大的时间和精力。所以,希望把自己趟过的路,插上路标,帮助童鞋们节约点时间。
上回说道:在 Windows 平台(本系列都是基于Windows平台,后面就不再注明了),node.js 可以精简到一个可执行文件,运行这个文件,我们就得到了一个控制台,在这个控制台,我们可以以 REPL (Read-Eval-Print-Loop) 的方式交互的执行js代码。
一、批量执行代码
好,顺理成章的下一个问题就是:如何批量执行 js 代码呢?回答是可以将 js 代码放进一个文件,然后将文件的路径作为参数告诉 node.exe 文件就可以了。就象 Java 执行一段代码一样。(粗体是我们键入内容,下同)
d: \myNodeJsDemo>node index.js
一个比较容易犯的错误就是键入 node 后回车,已经进入了 REPL 环境再执行上诉内容,那么你会得到新一行的三个点“…”,告诉你 node.js 在等待你完成 js 代码。你可以按 <ctrl>d退出 REPL 环境,在系统提示符下重来就可以了。
REPL 环境下,如果遇到连续的“…”,想放弃录入退回到 REPL 提示符,可以按 <ctrl>C,鉴于 js 复杂的嵌套,我想这是会经常遇到的。
二、前端呢?还是后端?这是个问题。
在大家的印象中,Javascript 很少逃出浏览器的五指山,所以,估计您和我一样,第一次接触到 Node.js 这个名字时,会误以为是一个新的前端框架。咱们误会人家人家了,Node.js 诞生的目的是为了建立服务器端应用的。所以,这个摸石头系列我们有两个任务要完成:
1、建立一个简单的静态web服务器。
2、架一个聊天室。
注意,以上两个任务只能使用 node.js 及其第三方模块,不可使用IIS、Apahe、Nginx等Web服务器。想一想,如果使用c、c++、java、c#等来实现,这两个任务够您忙活一下的吧。
而使用 node.js 来实现,你可以用两行代码就实现第一个任务。怎么样,期待吧,嘿嘿。
三、模块模块
学 C 语言的时候大家都明白,没有 stdio.h ,连最简单的屏幕打印都没法做。任何语言,失去了强大类库的支持,都会变的弱弱的。或者,换一个角度,任何成熟的语言,都是采用把强大的功能打包成类库的方式,实现语言的高扩展的。
现在明白为什么 Javascript 总是那么弱不禁风的样子了吗?嗯,就是因为缺少强大的类库啊。所以,一帮大牛开始考虑干这件事了,这个项目就是 CommonJS 。CommonJS 希望实现一个 Javascript 标准类库(或者说,定义了一套标准),使开发者能够利用 Javascirpt 来开发下列类型的应用:
1、服务器端应用;
2、命令行工具;
3、桌面基于 GUI 应用
4、混合应用(Titanium, Adobe AIR)
node.js 是 Common.JS 的实现者之一。好了,require 函数该出场了。在 CommonJS 规范中,使用这个函数来引入别的模块,说白了,就和 include(C) 、 import(JAVA) 、 using (C#) 等类似。比如,node.js 内置了个模块,专门帮助我们实现 http 服务。我们只需要:
var http = require(‘http’);
就可以开始使用该模块的功能了。截止2012年12月19日,node.js 官网现在已经注册了 5747 个第三方模块。安装这些模块也非常的简单,不过,还是先来完成任务一吧。
四、HTTP 服务之 Hello World
如果我说只用两行代码就实现一个 http 服务器,您不会用鸡蛋砸我吧?等,等等…… @#$*@(@!_#
实在要砸我,鸡蛋多浪费,换成小妹妹的香包什么的多好。
好吧,第一句上面我们已经写出来了。下面看完整代码!砸我!
//最简单 node.js http 服务器 //引入模块 var http = require('http); //创建一个服务并启动他 http.createServer().listen();
好了,任务完成,保存成 app.js 文件,并用:node app.js 运行吧。现在你可以用浏览器访问了,地址是:http://localhost 。什么?浏览器什么反应都没有?控制台也只有光标在闪啊闪?嗯,咱们换个端口吧,默认的80端口往往和我们其他的 web 服务有冲突:
var http = require('http'); //换成在888端口监听 http.createServer().listen(888);
相应的,访问地址也需要换一下:http://localhost:888 。还是没反应?好吧,为了说服你我们的服务器已经完美的在工作了,告诉你一个小秘密吧。http.createServer 其实是可以带参数的。你也知道,js 是个很自由的语言,参数是可以省略的,所以我就省略了。而且,你也知道, js 自由到可以用函数来做参数,嗯,您猜对了,http.createServer 的参数确实应该是一个函数。这个函数在每次有 http 请求进来的时候就会跑一遍,也就是说,您每用浏览器访问一次上面的地址,我们传进去的函数就运行一遍。OK,上试验:
var http = require('http'); http.createServer( //这里我们传进一个函数做参数 tellme ).listen(888); //请求进来时候执行的代码 function tellme(){ //在后台控制台提示有访问进来了。 console.log('I receive a quest.'); }
好,现在再访问试试。浏览器还是什么都没有。不过,每次我们刷新浏览器,后台都会告诉我们访问进来了。
好了,回家吃饭。后面内容,放第三篇唠叨吧。