系列目录:Node.js摸石头系列目录
一、完成HelloWorld
上回我们说到,使用 node.js ,我们可以迅速架起一个 http 服务器。不过上次咱们仅仅是在后台看到了客户端发来了访问,还没把 “Hello World” 给发出去呢。好,说干就干。
大家都明白,我们的Web应用抽象起来就是客户端发出请求,请求到达服务器后,服务器经过一番捣鼓,给客户端发回一个应答。“请求”我们一般抽象成 request,“应答”是 response。服务器和客户端(一般也就是浏览器啦,但是绝不局限于浏览器哦。)之间交流的语言就是 HTTP 协议了。至于服务器怎么折腾出一个应答来的,就八仙过海,各显神通了。
总之,Web 应用中两个重量级的东东就是: Request , Response 。
前面我们说到,每次有访问进来,我们的代码都会跑一遍。现在的问题是,在我们的代码里,怎么抓到客户端发来的 request , 然后,到哪里去找这个 response ,好把我们捣鼓出来的东西放进去,发给客户端呢?答案是,只要我们把他们作为参数交给 tellme 函数(你可以给这个函数取任何名字甚至不给他名字),然后,当请求到达时,node.js 就会把客户的请求封装成 request ,预备发给客户的应答封装成 response 。我们拿到 request ,看看他请求些什么,再折腾些东西(读出个文件也好,去查数据库也好,随便你了。)丢进 response ,发给客户端。
提醒:这种利用参数进行传递是 node.js 的常态。
请看代码:
/* Request and Response */ var http = require('http'); http.createServer( function(request, //客户端发来的请求,node.js 帮我们封装成 request 对象 response //我们利用response,向客户端发送回答 ){ //在控制台显示request对象 console.log(request); //总算完成 hello world 了。 response.end('Hello world!'); }).listen(888); console.log('Server start at 888');
运行他,用浏览器访问他。现在,在浏览器得到了咱们盼望已久的“Hello world!”,真不容易啊。再看看服务器的控制台,这么一大串的是什么?这个就是 Request 了。如果您熟悉 Json 格式,我想您已经看明白了,不熟悉也没关系,其实很简单,无非就是花括号( {} )标示对象,对象里各个属性用逗号( , )隔开,每个属性都由一个“键”和一个“值”组成,中间用冒号 ( : )分开,是不是很简单呢。
{ socket:{ ... }, ... headers: { host: 'localhost:888', connection: 'keep-alive', 'cache-control': 'max-age=0', 'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1 CoolNovoChromePlus/1.6.4.30', accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'accept-encoding': 'gzip,deflate,sdch', 'accept-language': 'zh-CN,zh;q=0.8', 'accept-charset': 'GBK,utf-8;q=0.7,*;q=0.3' }, ... url:'/', method:'GET', ... }
观察 request 对象,我们可以找到一些我们熟悉的东西。比如:request.url、request.method、比如 headers 。好,下面我们来把后台让我们眼花缭乱的输出简化一下:
/* Request and Response */ var http = require('http'); http.createServer( function(request, response ){ //只显示request对象的某几个属性 console.log(request.url); console.log(request.headers['user-agent']); //回应客户端 response.end('Hello world!'); }).listen(888); console.log('Server start at 888');
重启服务,访问服务器,观察后台。发现我们每刷新一次浏览器,其实进来了两个request,一个是访问’/’的,另一个是找 ‘favicon.ico ' 的,当然,很抱歉,目前还没有这个网站图标给他。控制台还显示了客户端用来访问服务器的浏览器的类型和版本。如果还想知道些什么,自己去 request 里面去挖吧。
系列四我们将完成一个静态的 Web 服务器,只要把静态页面丢进某个文件夹,就可以用浏览器访问。另由于昨天去考驾照理论课,进度有些慢了,对不住。