nodejs中實(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ù):
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:
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:
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:
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)文章
使用Node.js搭建靜態(tài)資源服務(wù)詳細(xì)教程
這篇文章主要介紹了使用Node.js搭建靜態(tài)資源服務(wù)器,需要的朋友可以參考下2017-08-08Node環(huán)境中JS代碼缺少window對象的原因和解決方案
你可能會在某些情況下需要在Node環(huán)境下運(yùn)行JavaScript代碼,但你也可能會遇到一個(gè)常見的問題:缺少window環(huán)境,在本文中,我們將深入探討這個(gè)問題的原因,并提供解決方案,需要的朋友可以參考下2023-08-08輕松創(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)針對單個(gè)實(shí)例的一或多個(gè)字段的自增、自減操作,也可以對符合條件的數(shù)據(jù)進(jìn)行批量的自增、自減操作。單個(gè)實(shí)例字段的自增、自減可以利用Instance的相應(yīng)方法實(shí)現(xiàn),而批量自增、自減則需要借助sequelize提供的字面量方法實(shí)現(xiàn)。下面來看看詳細(xì)的介紹吧。2016-12-12