(技術(shù))Node.js學(xué)習(xí)筆記 -- Node.js路由

先說說路由是干嘛的。
路由就是把對(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ù)。

  1. 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.


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,932評(píng)論 18 139
  • 個(gè)人入門學(xué)習(xí)用筆記、不過多作為參考依據(jù)。如有錯(cuò)誤歡迎斧正 目錄 簡(jiǎn)書好像不支持錨點(diǎn)、復(fù)制搜索(反正也是寫給我自己看...
    kirito_song閱讀 2,500評(píng)論 1 37
  • Node.js Stream(流) Stream 是一個(gè)抽象接口,Node 中有很多對(duì)象實(shí)現(xiàn)了這個(gè)接口。例如,對(duì)h...
    FTOLsXD閱讀 618評(píng)論 0 2
  • github地址,歡迎大家提交更新。 express() express()用來創(chuàng)建一個(gè)Express的程序。ex...
    Programmer客棧閱讀 2,590評(píng)論 0 1
  • 很多朋友都有這個(gè)問題,在手機(jī)不貼膜的情況下一些輕微的刮痕都會(huì)給屏幕留下比較明顯的劃痕。在手機(jī)貼上鋼化膜之后,那些劃...
    3C菜鳥閱讀 1,834評(píng)論 0 0