node.js入門 - 4.完善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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM