2011-11-15 24 views
2

所以我是一個系統程序員,目前教授自己的Web應用程序編程。在學習新知識的時候總是這樣,我還沒有牢牢把握慣用的實現方式,或者簡單地說,如何做到「正確」的方式。節點中的路由請求和結構化響應處理程序

在花費了一些時間來構建幾個遊戲和一些簡單的UI之後,我只使用HTML和JavaScript,現在我正在冒險進入一個不平凡的動態應用程序。我使用Node作爲我的服務器,並且有關如何路由響應處理程序的問題。

我正在關注(看似)nice guide found here。這是我迄今爲止發現的唯一向導,它會指導您如何構建一個實際的應用程序(而不是像response.write("Hello world"); response.end();之類的東西)。

筆者提出加入響應處理程序,像這樣:

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

的代碼應該是不言自明的,但本質上他是用一個對象作爲一個關聯容器映射在查詢字符串要求的資源處理程序。這一切都很好,但我希望避免每次添加新處理程序時在此文件中添加一行。

我的想法是這樣的;爲每個處理程序創建一個模塊並使用一些通用接口來處理響應。喜歡的東西:

function handleReq(...) { 
    ... 
} 

exports.handleRequest = handleReq; 

然後我可以只是require動態模塊,即

// in my router module 
function route(pathName, args) { 
    // where 'pathName' is something obtained 
    // in a manner like so in the request handler: 
    // url.parse(request.url).pathname; 

    var handler = require(pathName); 
    handler.handleRequest(args); 
} 

有一些缺陷,我不會在這種方法中看見了什麼?看起來好像它會減少冗餘代碼,但作爲這個領域的新手,我很懷疑。也許作者只是想保持簡單,或者我想可能是這樣,我錯過了一些東西。

歡呼聲,並提前致謝。不要隨意將其他看似無關的建議扔在我身上,如果你有理由這樣做。

回答

4

有很多方法可以做這些事情,我認爲這個指南試圖變得簡單。

我傾向於做這樣的事情:創建其中包含處理程序的模塊,並添加一個新的處理程序,只需將其添加到模塊的正確位置,它就會自動工作......無需修改任何其他代碼。服務器代碼只需要嘗試調用 moduleName.handleRequest(scriptName,req,resp); ,如果它返回true,那麼它是成功的。 (它可以在所有具有處理程序的模塊上嘗試它,如果沒有返回true,它可以顯示404)

scriptName假定已將路徑修剪掉(因此「/ start」只是「start 「等),如果您確實需要使用路徑來確定將其分派給哪個處理程序,我相信您可以以優雅的方式構建它,但我沒有打擾。

在模塊本身,你可以有這樣的事情:

var handlers = { 
start : function (req, resp) { 
    // ... 
    }, 

upload : function (req, resp) { 
    // ... 
    } 
}; 

export.handleRequest(name, req, resp) { 
    if (handlers[name] !== undefined) { 
    handlers[name](req,resp); 
    return true; 
    } 
    // do special cases (if there are any) 
    if (name === '') { 
    handlers.start(req,resp); 
    return true; 
    } 
    return false; // not found 
} 

這是你舉的例子中的複雜性/複雜性方面真的只是一步了。你可以繼續下去,直到你有一個完整的框架。

+0

聽起來不錯,謝謝你,先生。在教程中很難找到真實世界類型的用法,關閉以查找一些開放源代碼來審查... –

+0

我昨天晚上用我的方法注意到的一個問題;很難區分啓動腳本和請求靜態資源。無論如何,我會在github的一臺路由器上運行,因爲這更像是一次學習體驗。在路由請求之前,我可能需要根據GET的位置進行過濾。 –

+0

在我所做的幾件事情中,我包含了node_static模塊。使用它,您可以首先檢查請求是否可以作爲靜態資源處理,如果不是,請嘗試將其作爲腳本處理。或者相反。 – rob

相關問題