詳解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)聽器,用于收集每次接收到的新數(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í)或者工作帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
在Linux系統(tǒng)中搭建Node.js開發(fā)環(huán)境的簡(jiǎn)單步驟講解
這篇文章主要介紹了在Linux系統(tǒng)中搭建Node.js開發(fā)環(huán)境的步驟,Node使得JavaScript程序可以在本地操作系統(tǒng)環(huán)境中解釋運(yùn)行,需要的朋友可以參考下2016-01-01
mongoose設(shè)置unique不生效問題的解決及如何移除unique的限制
這篇文章主要給大家介紹了關(guān)于mongoose數(shù)據(jù)庫設(shè)置unique不生效問題的解決方法,以及Mongoose如何移除unique限制的方法示例,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
完美解決node.js中使用https請(qǐng)求報(bào)CERT_UNTRUSTED的問題
下面小編就為大家?guī)硪黄昝澜鉀Qnode.js中使用https請(qǐng)求報(bào)CERT_UNTRUSTED的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
30分鐘用Node.js構(gòu)建一個(gè)API服務(wù)器的步驟詳解
這篇文章主要介紹了30分鐘用Node.js構(gòu)建一個(gè)API服務(wù)器的步驟詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05
Node.js多文件Stream合并,串行和并發(fā)兩種模式的實(shí)現(xiàn)方式
這篇文章主要介紹了Node.js多文件Stream合并,串行和并發(fā)兩種模式的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10

