今天我們來完善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
