nodejs中實(shí)現(xiàn)路由功能
初學(xué)Node,發(fā)現(xiàn)了與自己之前的觀點(diǎn)完全不同的場(chǎng)面——你眼中的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代碼。
路由選擇的核心是路由,顧名思義,路由指的就是我們要針對(duì)不同的URL有不同的處理方式,例如處理/start的業(yè)務(wù)邏輯和處理/upload模塊 的業(yè)務(wù);邏輯就是不一致的。在現(xiàn)實(shí)的實(shí)現(xiàn)下,路由過程會(huì)在路由模塊中“結(jié)束”,并且路由模塊并不是真正者針對(duì)請(qǐng)求“采取行動(dòng)”的模塊,否則當(dāng)我們的應(yīng)用程 序變得更為復(fù)雜的時(shí)候就將無法得到很好的擴(kuò)展。
這里我們首先創(chuàng)建一個(gè)叫做requestHandlers的模塊,對(duì)于每一個(gè)請(qǐng)求處理程序都添加一個(gè)占位函數(shù):
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;
這樣我們就可以將請(qǐng)求處理程序和路由模塊連接起來,讓路由“有路可循”。之后我們確定將一系列請(qǐng)求處理程序通過一個(gè)對(duì)象來傳遞,并且需要使用松耦合的方式將這個(gè)對(duì)象注入到router()函數(shù)中,主文件index.js:
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映射到相同的請(qǐng)求處理程序上是容易的:只要在對(duì)象中添加一個(gè)鍵為“/”的屬性,對(duì)應(yīng) requestHandlers.start即可。這樣我們就可以簡潔地配置/start和/的請(qǐng)求都交給start這一處理程序來處理。在完成看對(duì)象的 定義后,我們將它作為額外的參數(shù)傳遞給服務(wù)器,見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.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對(duì)象作為第一個(gè)參數(shù)傳遞給了route()回調(diào)函數(shù),下面定義route.js:
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;
通過以上代碼,我們首先檢查給定的路徑對(duì)應(yīng)的請(qǐng)求處理程序是否存在,如果存在則直接調(diào)用相應(yīng)的函數(shù)。我們可以用從關(guān)聯(lián)數(shù)組中獲取元素一樣的方式從 傳遞的對(duì)象中獲取請(qǐng)求處理函數(shù),即handle[pathname]();這樣的表達(dá)式,給人一種感覺就像是在說“嗨,請(qǐng)你來幫我處理這個(gè)路徑?!背绦蜻\(yùn) 行效果如下圖:

相關(guān)文章
解決淘寶cnpm 安裝后cnpm不是內(nèi)部或外部命令的問題
今天小編就為大家分享一篇解決淘寶cnpm 安裝后cnpm不是內(nèi)部或外部命令的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Restify中接入Socket.io報(bào)Error:Can’t set headers的錯(cuò)誤解決
這篇文章主要給大家介紹了在Restify中接入Socket.io報(bào)Error:Can’t set headers的錯(cuò)誤解決方法,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-03-03
詳解node HTTP請(qǐng)求客戶端 - Request
Request是一個(gè)Node.jsNPM模塊,它是一個(gè)HTTP客戶端,使用簡單功能確十分強(qiáng)大2017-05-05
使用Node.js實(shí)現(xiàn)Clean?Architecture方法示例詳解
這篇文章主要為大家介紹了使用Node.js實(shí)現(xiàn)Clean?Architecture方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Node.js調(diào)試技術(shù)總結(jié)分享
Node.js是一個(gè)可以快速構(gòu)建網(wǎng)絡(luò)服務(wù)及應(yīng)用的平臺(tái)。該平臺(tái)的構(gòu)建是基于Chrome's JavaScript runtime,也就是說,實(shí)際上它是對(duì)Google V8引擎(應(yīng)用于Google Chrome瀏覽器)進(jìn)行了封裝。 今天介紹Node.js調(diào)式目前有幾種技術(shù),需要的朋友可以參考下。2017-03-03
Node如何實(shí)現(xiàn)在瀏覽器預(yù)覽項(xiàng)目的所有圖片詳解
最近項(xiàng)目遇到了個(gè)需求,需要將存放圖片進(jìn)行預(yù)覽,所以這篇文章主要給大家介紹了關(guān)于Node如何實(shí)現(xiàn)在瀏覽器預(yù)覽項(xiàng)目的所有圖片的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
npm?does?not?support?Node.js問題的解決辦法
這篇文章主要給大家介紹了關(guān)于npm?does?not?support?Node.js問題的解決辦法,文中通過代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-10-10
Sequelize中用group by進(jìn)行分組聚合查詢
大家都知道在SQL查詢中,分組查詢是較常用的一種查詢方式。分組查詢是指通過GROUP BY關(guān)鍵字,將查詢結(jié)果按照一個(gè)或多個(gè)字段進(jìn)行分組,分組時(shí)字段值相同的會(huì)被分為一組。在Node.js基于Sequelize的ORM框架中,同樣支持分組查詢,使用非常簡單方便。下面來看看詳細(xì)的介紹。2016-12-12

