node.js學習(2)–路由功能以及表單上傳

今天按照《node.js入門》這本書學習瞭node的一些基礎知識,包括服務器的創建,路由功能的實現,表單上傳和數據處理,感覺開始明白瞭node.js的一些基本原理。這本書說的很詳細也很基礎,很適合初學者學習。node.js入門

眾所周知,node跟php語言不一樣,node不需要依賴於apache等服務器,因為node本身就能夠構建服務器!所以,再用node開發網站之前我們首先得學會如何搭建服務器。關於node創建服務器在我之前的博客已經有介紹,這裡不再贅述。

完成一個表單上傳與數據處理的demo

1.明確功能,先確定需要建立哪些文件(由於隻是demo,我們不需要寫html文件,涉及前端的簡單處理就好。)

服務器文件server.js;程序入口文件index.js;路由文件router.js;請求處理文件 handleRequest.js

首先我們來寫入口文件:

var server= require("./server.js");//引入server.js
var router = require("./router.js");
var handle = require("./requestHandlers");

var handles ={};//關聯數組用來傳遞函數。
handles["/"] = handle.start;//這裡主要是為瞭後面的路由功能,用戶訪問localhost:3000/start就會直接轉到start方法
handles["/start"] = handle.start;
handles["/upload"] = handle.upload;

server.start(router.route,handles);

在index文件裡面,我們初始化一個關聯數組,用來存放需要用到的函數。並且開啟服務器。

server文件:

var  http = require("http"); 
//node.js 自帶的http模塊
var url= require("url");

function start(route,handles){
//創建一個HTTP服務器;
	http.createServer( function (req, res) { //匿名函數
	//大部分服務器會在用戶嘗試訪問localhost:8888時候訪問localhost:8888/favicon.ico,這裡去除這一訪問結果
	if(req.url == '/favicon.ico'){
		return;
	}
	var postData = "";
	var pathname =  url.parse(req.url).pathname;//解析出url裡面的路徑名
	req.setEncoding("utf8");
	req.addListener("data",function(postDataChunk){//通過回調函數的方式獲取post數據
		postData += postDataChunk ;
	});
	req.addListener("end",function(){
		route(handles,pathname,res,postData);
	});
	console.log("Requset"+pathname+"arrived!");
	}).listen(3000);//偵聽3000端口號
	console.log("HTTP server has started!");
}  
//將server中的代碼寫在一個start函數裡面。並且將該函數導出,一次完成代碼的模塊化,在其餘的文件中隻需要以   var  http = require("http")的形式進行調用; 
exports.start = start;

首先,我們設置瞭接收數據的編碼格式為 UTF-8,然後註冊瞭“data”事件的監聽器,用於收集每次接收到的新數據塊,並將其賦值給 postData 變量,最後,我們將請求路由的調用移到 end 事件處理程序中,以確保它隻會當所有數據接收完畢後才觸發,並且隻觸發一次。我們同時還把 POST 數據傳遞給請求路由,因為這些數據,請求處理程序會用到。為瞭使整個過程非阻塞,Node.js會將POST數據拆分成很多小的數據塊,然後通過觸發特定的事件,將這些小數據塊傳遞給回調函數。這裡的特定的事件有
data 事件(表示新的小數據塊到達瞭)以及 end 事件(表示所有的數據都已經接收完畢)。

router.js:

function route(handles,pathname,res,postData){
	console.log("About to route a request to"+pathname);
	if(typeof handles[pathname] === 'function'){//通過對路徑名稱的判斷,調用相應的函數進行處理,這是路由的基本思想。
		handles[pathname](res,postData);
	}else{
		console.log("No request handler found for " + pathname); 
	}
}
exports.route=route;

route函數傳遞三個參數,關聯數組handles(保存requestHandlers裡面的函數),pathname是訪問路徑,res是回應對象,postData是post接收的數組。

requestHandles.js

var  querystring = require("querystring");
function start(res){
	var body =  ''+     
	''+     ''+     ''+     
	''+     ''+     
	''+     
	''+     
	''+     ''+     
	''; 
	console.log("Request Handlers for 'start' was called");
	res.writeHead(200,{"Content-Type":"text/html"});
	res.write(body);
	res.end();
}
function upload(res,postData){
	res.writeHead(200,{"Content-Type":"text/plain"});
	var temp_data = querystring.parse(postData).text;
	res.write(temp_data);
	res.end();
	console.log("Reques Handlers for 'upload ' was called");
}
exports.start = start;
exports.upload = upload;

這個頁面裡面,start函數首先向用戶發送瞭一個網頁,包含輸入框和按鈕,用戶輸入文字點擊提交,數據被傳入upload文件並顯示。upload文件用於顯示。

發佈留言