欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

nodejs中實(shí)現(xiàn)路由功能

 更新時(shí)間:2014年12月29日 08:55:07   投稿:junjie  
這篇文章主要介紹了nodejs中實(shí)現(xiàn)路由功能,顧名思義,路由指的就是我們要針對不同的URL有不同的處理方式,本文將教你在node.js中實(shí)現(xiàn)路由功能,需要的朋友可以參考下

初學(xué)Node,發(fā)現(xiàn)了與自己之前的觀點(diǎn)完全不同的場面——你眼中的JavaScript,是干什么用的呢?特效?or 只是與客戶端的交互?可以說,JavaScript最早是運(yùn)行在瀏覽器中的,然而你要這樣想,瀏覽器只是你提供了一個(gè)上下文(context),它定義了 使用JavaScript可以做什么,這里可以想成類似的一個(gè)企業(yè),企業(yè)定義了你可以在這里做什么,但是并沒有說太多關(guān)于JavaScript語言本身可 以做什么。事實(shí)上,作為一門完整的語言,JavaScript可以使用在不同的上下文中,體現(xiàn)出不同的能力。這里所講到的Nodejs其實(shí)說白了就是提供 的一個(gè)上下文,一個(gè)運(yùn)行環(huán)境,它允許在后端(脫離瀏覽器環(huán)境)來運(yùn)行JavaScript代碼。

路由選擇的核心是路由,顧名思義,路由指的就是我們要針對不同的URL有不同的處理方式,例如處理/start的業(yè)務(wù)邏輯和處理/upload模塊 的業(yè)務(wù);邏輯就是不一致的。在現(xiàn)實(shí)的實(shí)現(xiàn)下,路由過程會在路由模塊中“結(jié)束”,并且路由模塊并不是真正者針對請求“采取行動”的模塊,否則當(dāng)我們的應(yīng)用程 序變得更為復(fù)雜的時(shí)候就將無法得到很好的擴(kuò)展。

這里我們首先創(chuàng)建一個(gè)叫做requestHandlers的模塊,對于每一個(gè)請求處理程序都添加一個(gè)占位函數(shù):


復(fù)制代碼 代碼如下:

function start(){  
    console.log("Request handler 'start' was called.");  
      
    function sleep(milliSeconds){  
        var startTime=new Date().getTime();  
        while(new Date().getTime()<startTime+milliSeconds);  
    }  
    sleep(10000);  
    return "Hello Start";  
}  
function upload(){  
    console.log("Request handler 'upload' was called.");  
    return "Hello Upload";  
}  
 
exports.start=start;  
exports.upload=upload;

這樣我們就可以將請求處理程序和路由模塊連接起來,讓路由“有路可循”。之后我們確定將一系列請求處理程序通過一個(gè)對象來傳遞,并且需要使用松耦合的方式將這個(gè)對象注入到router()函數(shù)中,主文件index.js:


復(fù)制代碼 代碼如下:

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);

如上所示,將不同的URL映射到相同的請求處理程序上是容易的:只要在對象中添加一個(gè)鍵為“/”的屬性,對應(yīng) requestHandlers.start即可。這樣我們就可以簡潔地配置/start和/的請求都交給start這一處理程序來處理。在完成看對象的 定義后,我們將它作為額外的參數(shù)傳遞給服務(wù)器,見server.js:

復(fù)制代碼 代碼如下:

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.writeHead(200,{"Content-Type":"text/plain"});  
        var content=route(handle,pathname);  
        response.write(content);  
        response.end();  
    }  
    http.createServer(onRequest).listen(8888);  
    console.log("Server has started.");  
}   
exports.start=start;

這樣就在start()函數(shù)中添加了handle參數(shù),并且把handle對象作為第一個(gè)參數(shù)傳遞給了route()回調(diào)函數(shù),下面定義route.js:

復(fù)制代碼 代碼如下:

function route(handle,pathname){  
    console.log("About to route a request for "+ pathname);  
    if(typeof handle[pathname]==='function‘){  
        return handle[pathname]();  
    }else{  
        console.log("No request handler found for "+pathname);  
        return "404 Not Found";  
    }  
}  
exports.route=route;

通過以上代碼,我們首先檢查給定的路徑對應(yīng)的請求處理程序是否存在,如果存在則直接調(diào)用相應(yīng)的函數(shù)。我們可以用從關(guān)聯(lián)數(shù)組中獲取元素一樣的方式從 傳遞的對象中獲取請求處理函數(shù),即handle[pathname]();這樣的表達(dá)式,給人一種感覺就像是在說“嗨,請你來幫我處理這個(gè)路徑?!背绦蜻\(yùn) 行效果如下圖:

 

相關(guān)文章

  • 前端必會的nodejs知識工具模塊使用示例詳解

    前端必會的nodejs知識工具模塊使用示例詳解

    這篇文章主要為大家介紹了前端必會的nodejs知識工具模塊使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 使用Node.js搭建靜態(tài)資源服務(wù)詳細(xì)教程

    使用Node.js搭建靜態(tài)資源服務(wù)詳細(xì)教程

    這篇文章主要介紹了使用Node.js搭建靜態(tài)資源服務(wù)器,需要的朋友可以參考下
    2017-08-08
  • Node環(huán)境中JS代碼缺少window對象的原因和解決方案

    Node環(huán)境中JS代碼缺少window對象的原因和解決方案

    你可能會在某些情況下需要在Node環(huán)境下運(yùn)行JavaScript代碼,但你也可能會遇到一個(gè)常見的問題:缺少window環(huán)境,在本文中,我們將深入探討這個(gè)問題的原因,并提供解決方案,需要的朋友可以參考下
    2023-08-08
  • Mac下通過brew安裝指定版本的nodejs教程

    Mac下通過brew安裝指定版本的nodejs教程

    今天小編就為大家分享一篇Mac下通過brew安裝指定版本的nodejs教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 如何用Node寫頁面爬蟲的工具集

    如何用Node寫頁面爬蟲的工具集

    這篇文章主要介紹了如何用Node寫頁面爬蟲的工具集,主要介紹了三種方法,分別是Puppeteer、cheerio和Auto.js,感興趣的小伙伴們可以參考一下
    2018-10-10
  • 輕松創(chuàng)建nodejs服務(wù)器(5):事件處理程序

    輕松創(chuàng)建nodejs服務(wù)器(5):事件處理程序

    這篇文章主要介紹了輕松創(chuàng)建nodejs服務(wù)器(5):事件處理程序,本系列文章將一步一步創(chuàng)建一個(gè)完整的nodejs服務(wù)器,需要的朋友可以參考下
    2014-12-12
  • Thinkjs3新手入門之如何使用靜態(tài)資源目錄

    Thinkjs3新手入門之如何使用靜態(tài)資源目錄

    最近在學(xué)習(xí)thinkjs3,發(fā)現(xiàn)有些地方還是有必要整理下的,下面這篇文章主要給大家介紹了關(guān)于Thinkjs3新手入門之如何使用靜態(tài)資源目錄的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-12-12
  • NodeJS安裝圖文教程

    NodeJS安裝圖文教程

    這篇文章主要為大家詳細(xì)介紹了NodeJS安裝圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • node.js Sequelize實(shí)現(xiàn)單實(shí)例字段或批量自增、自減

    node.js Sequelize實(shí)現(xiàn)單實(shí)例字段或批量自增、自減

    Sequelize 可以實(shí)現(xiàn)針對單個(gè)實(shí)例的一或多個(gè)字段的自增、自減操作,也可以對符合條件的數(shù)據(jù)進(jìn)行批量的自增、自減操作。單個(gè)實(shí)例字段的自增、自減可以利用Instance的相應(yīng)方法實(shí)現(xiàn),而批量自增、自減則需要借助sequelize提供的字面量方法實(shí)現(xiàn)。下面來看看詳細(xì)的介紹吧。
    2016-12-12
  • Node.JS事件的綁定與觸發(fā)示例詳解

    Node.JS事件的綁定與觸發(fā)示例詳解

    Node中的事件模型就是我們常見的訂閱發(fā)布模式,Nodejs核心API都采用異步事件驅(qū)動,所有可能觸發(fā)事件的對象都是一個(gè)繼承自EventEmitter類的子類實(shí)例對象,這篇文章主要給大家介紹了關(guān)于Node.JS事件的綁定與觸發(fā)事件的相關(guān)資料,需要的朋友可以參考下
    2022-11-11

最新評論