因為在post提交數據的時候,數據量可能會比較大,所以在獲取用戶的post提交數據時,是分多次提交的。所以我們應該將所有的數據收集完整,才開始對數據進行操作。
下面希望能收到一個對象,方法如下:
原生
- 監聽request對象可以使用on()方法
fs.readFile(path.join(__dirname,'data','data.json'),'utf8',function(err,data){
if(err&&err.code!=='ENOENT'){
throw err;
}
var list=JSON.parse(data||'[]');
//監聽reqyest的對象的時候
//聲明一個數組,用來保存用戶每次提交的數據
var array=[];
req.on('data',function(chunk){
//此處的chunk參數,就是瀏覽器本次提交過來的一部分數據
//chunk的數據類型是buffer
array.push(chunk);
});
});
注意:這里接收是一段段的buffer類型的數據,將它們存儲在一個數組中。
- 監聽request對象的end事件,end事件觸發,則數據提交完成
- 將buffer數組合並為一條數據
- 將buffer數據轉化為字符串
- 將字符串轉化為json格式
req.on('end',function(){
//這個事件中將array數組中的每個buffer匯總起來成為一個buffer,在將buffer轉化為字符串
//然后字符串轉化為json對象
//不能直接用JSON.parse,因為現在字符串是這樣的title=fff&url=ssss&text=isjsix
var postBody=Buffer.concat(array);
postBody=postBody.toString('utf8');
postBody=querystring.parse(postBody);
//postBody是對象了
上面需要注意 postBody=postBody.toString('utf8');
后得到的字符串不能通過JSON.parse直接轉化為json,title=fff&url=ssss&text=isjsix
需要使用querystring.parse
才行,querystring.parse
能把一個 URL 查詢字符串(str)解析成一個鍵值對的集合。
Express是基於NodeJs的Web框架,有很多中間件來處理某些響應以及給req,res添加了很多屬性和方法。在前面使用原生的req.on和req.end時,要寫不少代碼,比較麻煩。在Express中可以使用body-parser中間件來簡化剛才的過程。
body-parser的使用
npm install express body-parser
使用代碼:
const express = require("express");
const bodyParser = require("body-parser");
// 創建服務
const app = express();
// 使用 body-parser 中間
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
// 創建路由
app.post("/login", function (req, res) {
console.log(req.body);
res.send(req.body);
});
// 監聽服務
app.listen(3000, function () {
console.log("server start 3000");
});
當post請求時,body-parser會將數據轉化為對象掛在req.body
上,就不用我們自己從buffer轉字符串,再轉對象了。