今天我们来完善twitter应用。首先回到昨天的例子。
var express = require('express') var app = express() app.get('/', function(req, res) { res.send('Welcome to Node Twitter') }) app.listen(8000)
这里我们使用express模块来代替第一讲中使用的http模块,但其实express底层仍然使用到了http模块,它会帮我们完成服务器的创建和监听。完成express实例的创建之后,我们需要监听请求事件,这里我们使用get()方法,回调函数实现对请求类型为GET的请求的处理。接下来使用res.send()实现对客户端的相应,他集成了第一讲中res.writeHead();res.end();的功能。
我们来做一个完善点的版本。
var express = require('express'); var app = express(); app.listen(8000); var tweets=[]; app.get('/',function(req,res){ res.send('welcome to node twitter.'); }); app.post('/send',express.bodyParser(),function(req,res){ if(req.body && req.body.tweet){ tweets.push(req.body.tweet); res.send({status:'ok',message:'Tweet received'}); }else{ res.send({status:'nok',message:'no Tweet received'}); } }); app.get('/tweets',function(req,res){ res.send(tweets); });
我们对之前的代码做了些修改,添加了针对send和tweets请求的处理,同时把app.listen(8000);移到了上面的位置。把app.listen()移到上面不会和下面的get或者post请求处理造成竞争。不存在这种情况,服务器已经开始监听但是get和post函数还没来得及运行,这段时间来自用户的请求会被忽略。这是因为javascript是基于事件循环的,新的事件直到完成对已有代码运行情况的评估后才会被调用。回到这个问题上,也就是说request事件直到我们完成其余代码初始化之后才会被执行。另外一个原因是app.listen()是异步方法,因为他去绑定tcp端口需要一些时间。而事件监听(get,post)是同步的。
我们提供了三个处理请求的方法,app.post()包含三个参数,第二个参数可有可无,在这里express.bodyParser()实现把客户端请求获得的数据转换成js对象。express.bodyParser()为req添加了一个叫做req.body的属性,代表客户端传过来的数据。express.bodyParse()只为Content-Type为application/x-www-form-urlencoded 或者 application/json 的post请求工作,这两种情况下的数据都容易被转换成键值对的数据。该post事件最后返回json数据,并会为他添加合适的http请求头。
文章最后提供了demo下载,用webstorm打开运行。代码有点丑陋,功能也相当的不完善,因为我也是刚接触node很多东西还不太清楚怎么弄,所以请大家见谅。站点的两个地址需要手工切换,http://localhost:3000/,http://localhost:3000/tweets。
demo下载地址:twitter.zip