先說說路由是干嘛的。
路由就是把對(duì)應(yīng)的請(qǐng)求地址,指定到對(duì)應(yīng)的處理方法上。
因此,要為路由提供請(qǐng)求的URL和其他需要的GET以及POST參數(shù),然后路由根據(jù)這些數(shù)據(jù)
執(zhí)行相應(yīng)的代碼。
下面問題來了,既然路由需要請(qǐng)求URL和參數(shù),該怎么獲取URL請(qǐng)求路徑和參數(shù)呢?
我們需要的所有的數(shù)據(jù)都包含在request對(duì)象中,該對(duì)象最為onRequest()回調(diào)函數(shù)的第一個(gè)參數(shù)傳遞
解析URL和參數(shù)用到了Node.js其他模塊: url 、 querystring 。
下面分別介紹如何使用 url 和 querystring 獲取參數(shù)。
- url 獲取請(qǐng)求的路徑與參數(shù)
示例:
http://localhost:8888/start?name=jim&age=22
url.parse(string).pathname → /start
url.parse(string).query → name=jim&age=22
代碼示例如下:
// 引入 http模塊
var http = require('http');
// 引入 url 模塊
var url = require('url');
// 匿名函數(shù)作為參數(shù)傳遞給http.createServer()
http.createServer(function(request,response){
// 設(shè)置 charset=utf-8 否則會(huì)亂碼
response.writeHead(200,{'Content-Type':'text/plain;charset=utf-8'});
// /start?name=jim&age=22
console.log("request.url: "+request.url);
// 獲取訪問的路徑 /start
var pathname = url.parse(request.url).pathname;
// 獲取參數(shù)值 name: jim , age: 12
var params = url.parse(request.url,true).query; // true 不能缺少,否則會(huì)報(bào)錯(cuò)
response.write("訪問路徑pathname: "+pathname+"\n");
response.write("姓名name: "+params.name+"\n");
response.write("年齡age: "+params.age);
console.log("訪問路徑pathname:"+pathname+"\n"+"姓名name:"+params.name+"\n"+"年齡age:"+params.age);
response.end();
}).listen(8888);
console.log('server is running http://127.0.0.1:8888/start?name=jim&age=22');
運(yùn)行結(jié)果:
server is running http://127.0.0.1:8888/start?name=jim&age=22
request.url: /start?name=jim&age=22
訪問路徑pathname: /start
姓名name: jim
年齡age: 22
2.querystring 獲取請(qǐng)求的路勁與參數(shù)
示例:
http://localhost:8888/start?name=jim&age=22
querystring.parse(string)['name'] → jim
querystring.parse(string)['age'] → 22
示例代碼:
// 引入http模塊
var http = require('http');
// 引入querystring模塊
var querystring = require('querystring');
// 匿名函數(shù)作為參數(shù)傳遞給http.createServer()
http.createServer(function(request,response){
// 設(shè)置 charset=utf-8 否則會(huì)亂碼
response.writeHead(200,{'Content-Type':'text/plain;charset=utf-8'});
// /start?name=jim&age=22
console.log("request.url: "+request.url);
var name = querystring.parse(request.url)['/start?name'];
var age = querystring.parse(request.url)['age'];
response.write("name:"+name+"\n");
response.write("age:"+age+"\n");
response.end();
console.log("姓名name: "+name+"\n"+"年齡age: "+age);
var obj = querystring.parse(request.url);
console.log("obj: "+JSON.stringify(obj, null, 4));
}).listen(8888)
console.log('server is running http://127.0.0.1:8888/start?name=jim&age=22');
運(yùn)行結(jié)果:
server is running http://127.0.0.1:8888/start?name=jim&age=22
request.url: /start?name=jim&age=22
姓名name: jim
年齡age: 22
obj: {
"/start?name": "jim",
"age": "22"
}
以上我們可以通過請(qǐng)求的URL路徑區(qū)別不同的請(qǐng)求了,然后將請(qǐng)求以URL路徑為基準(zhǔn)映射到處理程序上使用
不同的代碼來處理。
接下來我們編寫一個(gè)路由用以獲取請(qǐng)求的URL路徑,并且把路由與服務(wù)器整合起來。
編寫路由就是編寫一個(gè)js文件,并且作為一個(gè)模塊,我們知道Node.js中一個(gè)文件其實(shí)就是一個(gè)模塊。
創(chuàng)建一個(gè)router.js文件作為一個(gè)模塊,代碼如下:
function route(pathname){
console.log("request path is "+pathname);
}
exports.route = route;
接下來我們編寫一個(gè)server.js文件,作為一個(gè)模塊,擴(kuò)展一下服務(wù)器的start()函數(shù),然后將路由函數(shù)做為
一個(gè)參數(shù)傳遞到start()函數(shù)中,server.js代碼如下:
// 引入http模塊
var http = require('http');
// 引入 url 模塊
var url = require('url');
// 這里start函數(shù)的參數(shù)route也是一個(gè)函數(shù),函數(shù)定義在router.js文件中
function start(route){
function onRequest(request,response){
//通過url模塊獲取請(qǐng)求路徑
var pathname = url.parse(request.url).pathname;
console.log('Request for '+pathname+' received.');
// 將請(qǐng)求路徑傳遞給路由函數(shù)
route(pathname);
response.writeHead(200,{'Content-Type':'text/plain;charset=utf-8'});
response.write('Hello,三瘋');
response.end();
}
http.createServer(onRequest).listen(8888);
console.log('Server has started.');
}
exports.start = start;
同時(shí),我們創(chuàng)建index.js文件,使得路由函數(shù)注入到服務(wù)器中,
index.js文件代碼如下:
// 引入 server模塊兒
var server = require('E:\\nodejs\\server');
// 引入路由模塊兒
var router = require('E:\\nodejs\\router');
server.start(router.route);
運(yùn)行結(jié)果:
Server is started.
Request for /start received.