<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                回到正題,現在我們的HTTP服務器和請求路由模塊已經如我們的期望,可以相互交流了,就像一對親密無間的兄弟。 當然這還遠遠不夠,路由,顧名思義,是指我們要針對不同的URL有不同的處理方式。例如處理_/start_的“業務邏輯”就應該和處理_/upload_的不同。 在現在的實現下,路由過程會在路由模塊中“結束”,并且路由模塊并不是真正針對請求“采取行動”的模塊,否則當我們的應用程序變得更為復雜時,將無法很好地擴展。 我們暫時把作為路由目標的函數稱為請求處理程序。現在我們不要急著來開發路由模塊,因為如果請求處理程序沒有就緒的話,再怎么完善路由模塊也沒有多大意義。 應用程序需要新的部件,因此加入新的模塊 -- 已經無需為此感到新奇了。我們來創建一個叫做requestHandlers的模塊,并對于每一個請求處理程序,添加一個占位用函數,隨后將這些函數作為模塊的方法導出: ~~~ function start() { ? console.log("Request handler 'start' was called."); } function upload() { ? console.log("Request handler 'upload' was called."); } exports.start = start; exports.upload = upload; ~~~ 這樣我們就可以把請求處理程序和路由模塊連接起來,讓路由“有路可尋”。 在這里我們得做個決定:是將requestHandlers模塊硬編碼到路由里來使用,還是再添加一點依賴注入?雖然和其他模式一樣,依賴注入不應該僅僅為使用而使用,但在現在這個情況下,使用依賴注入可以讓路由和請求處理程序之間的耦合更加松散,也因此能讓路由的重用性更高。 這意味著我們得將請求處理程序從服務器傳遞到路由中,但感覺上這么做更離譜了,我們得一路把這堆請求處理程序從我們的主文件傳遞到服務器中,再將之從服務器傳遞到路由。 那么我們要怎么傳遞這些請求處理程序呢?別看現在我們只有2個處理程序,在一個真實的應用中,請求處理程序的數量會不斷增加,我們當然不想每次有一個新的URL或請求處理程序時,都要為了在路由里完成請求到處理程序的映射而反復折騰。除此之外,在路由里有一大堆_if request == x then call handler y_也使得系統丑陋不堪。 仔細想想,有一大堆東西,每個都要映射到一個字符串(就是請求的URL)上?似乎關聯數組(associative array)能完美勝任。 不過結果有點令人失望,JavaScript沒提供關聯數組 -- 也可以說它提供了?事實上,在JavaScript中,真正能提供此類功能的是它的對象。 在這方面,[http://msdn.microsoft.com/en-us/magazine/cc163419.aspx](http://msdn.microsoft.com/en-us/magazine/cc163419.aspx)有一個不錯的介紹,我在此摘錄一段: > 在C++或C#中,當我們談到對象,指的是類或者結構體的實例。對象根據他們實例化的模板(就是所謂的類),會擁有不同的屬性和方法。但在JavaScript里對象不是這個概念。在JavaScript中,對象就是一個鍵/值對的集合 -- 你可以把JavaScript的對象想象成一個鍵為字符串類型的字典。 但如果JavaScript的對象僅僅是鍵/值對的集合,它又怎么會擁有方法呢?好吧,這里的值可以是字符串、數字或者……函數! 好了,最后再回到代碼上來。現在我們已經確定將一系列請求處理程序通過一個對象來傳遞,并且需要使用松耦合的方式將這個對象注入到_route()_函數中。 我們先將這個對象引入到主文件_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); ~~~ 雖然_handle_并不僅僅是一個“東西”(一些請求處理程序的集合),我還是建議以一個動詞作為其命名,這樣做可以讓我們在路由中使用更流暢的表達式,稍后會有說明。 正如所見,將不同的URL映射到相同的請求處理程序上是很容易的:只要在對象中添加一個鍵為_"/"_的屬性,對應_requestHandlers.start_即可,這樣我們就可以干凈簡潔地配置_/start_和_/_的請求都交由_start_這一處理程序處理。 在完成了對象的定義后,我們把它作為額外的參數傳遞給服務器,為此將_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"}); ? ? response.write("Hello World"); ? ? response.end();? } ? http.createServer(onRequest).listen(8888); ? console.log("Server has started."); } exports.start = start; ~~~ 這樣我們就在_start()_函數里添加了_handle_參數,并且把handle對象作為第一個參數傳遞給了_route()_回調函數。 然后我們相應地在_route.js_文件中修改_route()_函數: ~~~ function route(handle, pathname) { ? console.log("About to route a request for " + pathname);? if (typeof handle[pathname] === 'function') { ? ? handle[pathname]();? } else { ? ? console.log("No request handler found for " + pathname);? } } exports.route = route; ~~~ 通過以上代碼,我們首先檢查給定的路徑對應的請求處理程序是否存在,如果存在的話直接調用相應的函數。我們可以用從關聯數組中獲取元素一樣的方式從傳遞的對象中獲取請求處理函數,因此就有了簡潔流暢的形如_handle[pathname]();_的表達式,這個感覺就像在前方中提到的那樣:“嗨,請幫我處理了這個路徑”。 有了這些,我們就把服務器、路由和請求處理程序在一起了。現在我們啟動應用程序并在瀏覽器中訪問_http://localhost:8888/start_,以下日志可以說明系統調用了正確的請求處理程序: ~~~ Server has started. Request for /start received. About to route a request for /start Request handler 'start' was called. ~~~ 并且在瀏覽器中打開_http://localhost:8888/_可以看到這個請求同樣被_start_請求處理程序處理了: ~~~ Request for / received. About to route a request for / Request handler 'start' was called. ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看