nodejs中實(shí)現(xiàn)路由功能
初學(xué)Node,發(fā)現(xiàn)了與自己之前的觀點(diǎn)完全不同的場(chǎng)面——你眼中的JavaScript,是干什么用的呢?特效?or 只是與客戶端的交互?可以說(shuō),JavaScript最早是運(yùn)行在瀏覽器中的,然而你要這樣想,瀏覽器只是你提供了一個(gè)上下文(context),它定義了 使用JavaScript可以做什么,這里可以想成類似的一個(gè)企業(yè),企業(yè)定義了你可以在這里做什么,但是并沒有說(shuō)太多關(guān)于JavaScript語(yǔ)言本身可 以做什么。事實(shí)上,作為一門完整的語(yǔ)言,JavaScript可以使用在不同的上下文中,體現(xiàn)出不同的能力。這里所講到的Nodejs其實(shí)說(shuō)白了就是提供 的一個(gè)上下文,一個(gè)運(yùn)行環(huán)境,它允許在后端(脫離瀏覽器環(huán)境)來(lái)運(yùn)行JavaScript代碼。
路由選擇的核心是路由,顧名思義,路由指的就是我們要針對(duì)不同的URL有不同的處理方式,例如處理/start的業(yè)務(wù)邏輯和處理/upload模塊 的業(yè)務(wù);邏輯就是不一致的。在現(xiàn)實(shí)的實(shí)現(xiàn)下,路由過(guò)程會(huì)在路由模塊中“結(jié)束”,并且路由模塊并不是真正者針對(duì)請(qǐng)求“采取行動(dòng)”的模塊,否則當(dāng)我們的應(yīng)用程 序變得更為復(fù)雜的時(shí)候就將無(wú)法得到很好的擴(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)求處理程序和路由模塊連接起來(lái),讓路由“有路可循”。之后我們確定將一系列請(qǐng)求處理程序通過(guò)一個(gè)對(duì)象來(lái)傳遞,并且需要使用松耦合的方式將這個(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即可。這樣我們就可以簡(jiǎn)潔地配置/start和/的請(qǐng)求都交給start這一處理程序來(lái)處理。在完成看對(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;
通過(guò)以上代碼,我們首先檢查給定的路徑對(duì)應(yīng)的請(qǐng)求處理程序是否存在,如果存在則直接調(diào)用相應(yīng)的函數(shù)。我們可以用從關(guān)聯(lián)數(shù)組中獲取元素一樣的方式從 傳遞的對(duì)象中獲取請(qǐng)求處理函數(shù),即handle[pathname]();這樣的表達(dá)式,給人一種感覺就像是在說(shuō)“嗨,請(qǐng)你來(lái)幫我處理這個(gè)路徑?!背绦蜻\(yùn) 行效果如下圖:
相關(guān)文章
前端必會(huì)的nodejs知識(shí)工具模塊使用示例詳解
這篇文章主要為大家介紹了前端必會(huì)的nodejs知識(shí)工具模塊使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10使用Node.js搭建靜態(tài)資源服務(wù)詳細(xì)教程
這篇文章主要介紹了使用Node.js搭建靜態(tài)資源服務(wù)器,需要的朋友可以參考下2017-08-08Node環(huán)境中JS代碼缺少window對(duì)象的原因和解決方案
你可能會(huì)在某些情況下需要在Node環(huán)境下運(yùn)行JavaScript代碼,但你也可能會(huì)遇到一個(gè)常見的問(wèn)題:缺少window環(huán)境,在本文中,我們將深入探討這個(gè)問(wèn)題的原因,并提供解決方案,需要的朋友可以參考下2023-08-08Mac下通過(guò)brew安裝指定版本的nodejs教程
今天小編就為大家分享一篇Mac下通過(guò)brew安裝指定版本的nodejs教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05輕松創(chuàng)建nodejs服務(wù)器(5):事件處理程序
這篇文章主要介紹了輕松創(chuàng)建nodejs服務(wù)器(5):事件處理程序,本系列文章將一步一步創(chuàng)建一個(gè)完整的nodejs服務(wù)器,需要的朋友可以參考下2014-12-12node.js Sequelize實(shí)現(xiàn)單實(shí)例字段或批量自增、自減
Sequelize 可以實(shí)現(xiàn)針對(duì)單個(gè)實(shí)例的一或多個(gè)字段的自增、自減操作,也可以對(duì)符合條件的數(shù)據(jù)進(jìn)行批量的自增、自減操作。單個(gè)實(shí)例字段的自增、自減可以利用Instance的相應(yīng)方法實(shí)現(xiàn),而批量自增、自減則需要借助sequelize提供的字面量方法實(shí)現(xiàn)。下面來(lái)看看詳細(xì)的介紹吧。2016-12-12