自學Node.js 三:優化路由邏輯

      
       上篇文檔我們是通過在server.js中對不同的url_path來執行不同的請求邏輯(行爲驅動執行)。其實,這是最直接最原始的實現方式,往往我們會把一大坨的邏輯處理放到一起來搞,就像以前學習VB6的時候,一個vb文件可能包含了用戶登錄、用戶信息CRUD等等,甚至上千行代碼。代碼的冗餘度很大,沒有模塊化。
    
      Node.js具是有模塊和包的設計概念,比如server.js就是最普通的一個獨立模塊,還有require("http")中的http模塊就是引入的c/c++擴展類庫。下面將路由的概念和設計引入,咱們要避免重複的if/else分支,多用一些腳本語言的特性,儘量簡化server.js中的if/else邏輯。怎麼做呢? 

      類比Java Web開發中常用的Struts框架,就是解決了servlet開發中的if/else問題,通過核心Action類和配置文件來管理請求入口。我們可以如下方法,來簡單處理,將每個請求分支配置起來(放到一個handle對象中,通過這個對象來對映射不同的action)。

      先新建一個requestHandlers.js(action模塊):
function start(response){
    response.writeHead(200,{"Content-Type":"text/plain"});
    response.write("start") ;
    response.end();
   return ("Request handler 'start' was called.");
}

function upload(response){
    response.writeHead(200,{"Content-Type":"text/plain"});
    response.write("upload") ;
    response.end();
    return ("Request handler 'upload' was called.");
}

exports.start = start;
exports.upload = upload;

     修改 route.js(路由模塊)爲:
//把response對象傳給handlers模塊,直接將結果返回到頁面或進行處理。
function route(handle,pathname,response){
    console.log(typeof handle[pathname]) ;
    //判斷當前映射的action是否爲一個函數
    if(typeof handle[pathname] === 'function') {
       //不用知道這裏的handle是什麼對象,直接執行handle的特定方法就可以
       var content = handle[pathname](response);
       console.log("handle content: "+content) ;

    }else{
        console.log("No request handler found for " + pathname) ;
        response.write(404,{"Content-Type":"text/plain"});
        response.write("404 not found");
        response.end();
    }
}

    修改server.js爲:
var http = require("http");
var url = require("url");

function start(route,handle) {
    function   onRequest(request,response)  {
        var pathname = url.parse(request.url).pathname;
        console.log("Request for "+pathname+" received.") ;
        //調用路由模塊
        route(handle,pathname,response);
    }
    http.createServer(onRequest).listen(3333);
    console.log("Server has  started");
}
exports.start = start;

    修改index.js(頁面入口)爲:
var server  = require("./service/server")  ;
var router = require("./service/route");
var requestHandlers = require("./service/requestHandlers");

//創建handle映射類,就是將請求路徑和具體的action函數進行映射關聯
//var handle = {"/":requestHandlers.start,
//                "/start":requestHandlers.start,
//                "/upload":requestHandlers.upload};

var handle = {};
handle["/"] = requestHandlers.start;
handle["/start"]  = requestHandlers.start;
handle["/upload"]  = requestHandlers.upload;
console.dir(["handle",handle]);
server.start(router.route,handle);

      下面我們啓動webstorm來看一下,首先打印出來的是handle映射類的結構,然後程序會根據我們請求的不同路徑來執行不同的代碼邏輯,通過這樣模塊化和代碼重構之後,我們這個簡單的路由映射demo就結束了。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章