詳解Node.Js如何處理post數(shù)據(jù)
實(shí)現(xiàn)思路
將data和end事件的回調(diào)函數(shù)直接放在服務(wù)器中,在data事件回調(diào)中收集所有的POST數(shù)據(jù),當(dāng)接收到所有數(shù)據(jù),觸發(fā)end事件后,其回調(diào)函數(shù)調(diào)用請(qǐng)求路由,并將數(shù)據(jù)傳遞給它,然后,請(qǐng)求路由再將該數(shù)據(jù)傳遞給請(qǐng)求處理程序。
實(shí)現(xiàn)步驟
第一步我們?cè)O(shè)置了接收數(shù)據(jù)的編碼格式為UTF-8,第二步注冊(cè)了“data”事件的監(jiān)聽(tīng)器,用于收集每次接收到的新數(shù)據(jù)塊,并將其賦值給postData 變量,最后第三步我們將請(qǐng)求路由的調(diào)用移到end事件處理程序中,以確保它只會(huì)當(dāng)所有數(shù)據(jù)接收完畢后才觸發(fā),并且只觸發(fā)一次。我們同時(shí)還把POST數(shù)據(jù)傳遞給請(qǐng)求路由
示例代碼
index.js
var server = require("./server");
var router=require("./router");
var requestHandlers=require("./requestHandlers");
var handle = {}
handle["/"] = requestHandlers.start;
handle["/start"] = requestHandlers.start;
handle["/upload"] = requestHandlers.upload;
server.start(router.route,handle);
server.js
var http = require("http");
var url=require("url");
function start(route,handle) {
function onRequest(request, response) {
var postData="";
var pathname=url.parse(request.url).pathname;
console.log("Request for"+pathname+"received.");
request.setEncoding("utf8");
request.addListener("data", function(postDataChunk) {
postData += postDataChunk;
console.log("Received POST data chunk '"+
postDataChunk + "'.");
});
request.addListener("end", function() {
route(handle, pathname, response, postData);
});
//route(handle,pathname,response);
//response.writeHead(200, {"Content-Type": "text/plain"});
//response.write("this is a demo");
//response.end();
}
http.createServer(onRequest).listen(5656,'127.0.0.1');
console.log("Server has started. localhost:5656");
}
exports.start = start;
router.js
function route(handle,pathname,response,postData){
console.log("About to route a request for"+pathname);
if(typeof handle[pathname]=='function'){
handle[pathname](response,postData);
}
else{
console.log("no request handler found for"+pathname);
response.writeHead(404, {"Content-Type": "text/plain"});
response.write("404 Not found");
response.end();
}
}
exports.route=route;
requestHandlers.js
//var querystring = require("querystring");
function start(response,postData) {
console.log("Request handler 'start' was called.");
var body = '<html>'+
'<head>'+
'<meta http-equiv="Content-Type" content="text/html; '+
'charset=UTF-8" />'+
'</head>'+
'<body>'+
'<form action="/upload" method="post">'+
'<textarea name="text" rows="20" cols="60"></textarea>'+
'<input type="submit" value="Submit text" />'+
'</form>'+
'</body>'+
'</html>';
response.writeHead(200, {"Content-Type": "text/html"});
response.write(body);
response.end();
}
function upload(response,postData) {
console.log("Request handler 'upload' was called.");
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("You've sent: " + postData);
response.end();
}
exports.start = start;
exports.upload = upload;
運(yùn)行:node mynode/index
瀏覽器輸入http://localhost:5656/

結(jié)果:

在文本框里輸入“I LOVE YOU” 點(diǎn)擊提交


使用querystring模塊只提取文本,修改一下requestHandlers.js使只返回文本
var querystring = require("querystring");
function start(response,postData) {
console.log("Request handler 'start' was called.");
var body = '<html>'+
'<head>'+
'<meta http-equiv="Content-Type" content="text/html; '+
'charset=UTF-8" />'+
'</head>'+
'<body>'+
'<form action="/upload" method="post">'+
'<textarea name="text" rows="20" cols="60"></textarea>'+
'<input type="submit" value="Submit text" />'+
'</form>'+
'</body>'+
'</html>';
response.writeHead(200, {"Content-Type": "text/html"});
response.write(body);
response.end();
}
function upload(response,postData) {
console.log("Request handler 'upload' was called.");
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("You've sent: " + querystring.parse(postData).text);
response.end();
}
exports.start = start;
exports.upload = upload;
重新啟動(dòng),依舊輸入I LOVE YOU ,提交

總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望這篇文章的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
相關(guān)文章
Express下采用bcryptjs進(jìn)行密碼加密的方法
本篇文章主要介紹了Express下采用bcryptjs進(jìn)行密碼加密的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
淺談Node新版本13.2.0正式支持ES Modules特性
這篇文章主要介紹了淺談Node新版本13.2.0正式支持ES Modules特性,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Nodejs實(shí)現(xiàn)WebSocket代碼實(shí)例
這篇文章主要介紹了Nodejs實(shí)現(xiàn)WebSocket代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
利用node+koa+axios實(shí)現(xiàn)圖片上傳和回顯功能
這篇文章為大家詳細(xì)介紹了如何利用node+koa+axios實(shí)現(xiàn)圖片上傳和回顯功能,主要實(shí)現(xiàn)簡(jiǎn)單的圖片上傳和靜態(tài)內(nèi)容的訪問(wèn),感興趣的可以了解一下2022-05-05
node.js中的buffer.Buffer.isEncoding方法使用說(shuō)明
這篇文章主要介紹了node.js中的buffer.Buffer.isEncoding方法使用說(shuō)明,本文介紹了buffer.Buffer.isEncoding的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12
Mongoose經(jīng)常返回e11000 error的原因分析
這篇文章主要給大家分析了Mongoose經(jīng)常返回e11000 error的原因,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友可以們下面來(lái)一起看看吧。2017-03-03

