Fork me on GitHub
完善twitter

今天我们来完善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

 
分类: HTML5/CSS3node.js
posted on 2012-09-22 20:34  HackerVirus  阅读(160)  评论(0编辑  收藏  举报