架一个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.');
}

    好,现在再访问试试。浏览器还是什么都没有。不过,每次我们刷新浏览器,后台都会告诉我们访问进来了。

    好了,回家吃饭。后面内容,放第三篇唠叨吧。

posted @ 2011-12-19 12:05  坐看云起  阅读(7785)  评论(12编辑  收藏  举报