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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Middleware [TOC=2,3] 當處理用戶的請求時,需要經過很多處理,如:解析參數,判斷是否靜態資源訪問,路由解析,頁面靜態化判斷,執行操作,查找模版,渲染模版等。項目里根據需要可能還會增加其他的一些處理,如:判斷 IP 是否在黑名單中,CSRF 檢測等。 ThinkJS 里通過 middleware 來處理這些邏輯,每個邏輯都是一個獨立的 middleware。在請求處理中埋很多 hook,每個 hook 串行執行一系列的 middleware,最終完成一個請求的邏輯處理。 ## hook 列表 框架里包含的 hook 列表如下: * `request_begin`?請求開始 * `payload_parse`?解析提交上來的數據 * `payload_validate`?驗證提交的數據 * `resource`?靜態資源請求處理 * `route_parse`?路由解析 * `logic_before`?logic 處理之前 * `logic_after`?logic 處理之后 * `controller_before`?controller 處理之前 * `controller_after`?controller 處理之后 * `view_before`?視圖處理之前 * `view_template`?視圖文件處理 * `view_parse`?視圖解析 * `view_after`?視圖處理之后 * `response_end`?請求響應結束 每個 hook 里調用多個 middleware 來完成處理,具體包含的 middleware 如下: ~~~ export default { request_begin: [], payload_parse: ["parse_form_payload", "parse_single_file_payload", "parse_json_payload", "parse_querystring_payload"], payload_validate: ["validate_payload"], resource: ["check_resource", "output_resource"], route_parse: ["rewrite_pathname", "subdomain_deploy", "route"], logic_before: ["check_csrf"], logic_after: [], controller_before: [], controller_after: [], view_before: [], view_template: ["locate_template"], view_parse: ["parse_template"], view_after: [], response_end: [] }; ~~~ ## 配置 hook hook 默認執行的 middleware 往往不能滿足項目的需求,可以通過配置修改 hook 對應要執行的 middleware 來完成,hook 的配置文件為?`src/common/config/hook.js`。 ~~~ export default { payload_parse: ["parse_xml"], //解析 xml } ~~~ 上面的配置會覆蓋掉默認的配置值。如果在原有配置上增加的話,可以通過下面的方式: #### 在前面追加 ~~~ export default { payload_parse: ["prepend", "parse_xml"], //在前面追加解析 xml } ~~~ ##### 在后面追加 ~~~ export default { payload_parse: ["append", "parse_xml"], //在后面追加解析 xml } ~~~ `注:`建議使用追加的方式配置 middleware,系統的 middleware 名稱可能在后續的版本中有所修改。 ## 執行 hook 可以通過?`think.hook`?方法執行一個對應的 hook,如: ~~~ await think.hook("payload_parse", http, data); //返回的是一個 Promise ~~~ 在含有?`http`?對象的類中可以直接使用?`this.hook`?來執行 hook,如: ~~~ await this.hook("payload_parse", data); ~~~ ## 創建 middleware ThinkJS 支持 2 種方式的 middleware,即:class 方式和 function 方式。可以根據 middleware 復雜度決定使用哪種方式。 ### class 方式 如果 middleware 需要執行的邏輯比較復雜,需要定義為 class 的方式。可以通過?`thinkjs`?命令來創建 middleware,在項目目錄下執行如下的命令: ~~~ thinkjs middleware xxx ~~~ 執行完成后,會看到對應的文件?`src/common/middleware/xxx.js`。 #### ES6 方式 ~~~ "use strict"; /** * middleware */ export default class extends think.middleware.base { /** * run * @return {} [] */ run(){ } } ~~~ #### 動態創建類的方式 ~~~ "use strict"; /** * middleware */ module.exports = think.middleware({ /** * run * @return {} [] */ run: function(){ } }) ~~~ middleware 里會將?`http`?傳遞進去,可以通過?`this.http`?屬性來獲取。邏輯代碼放在?`run`?方法執行,如果含有異步操作,需要返回一個?`Promise`?或者使用?`*/yield`。 ### function 方式 如果 middleware 要處理的邏輯比較簡單,可以直接創建為函數的形式。這種 middleware 不建議創建成一個獨立的文件,而是放在一起統一處理。 可以建立文件?`src/common/bootstrap/middleware.js`,該文件在服務啟動時會自動被加載。可以在這個文件添加多個函數式的 middleware。如: ~~~ think.middleware("parse_xml", http => { if (!http.payload) { return; } ... }); ~~~ 函數式的 middleware 會將?`http`?對象作為一個參數傳遞進去,如果 middleware 里含有異步操作,需要返回一個?`Promise`?或者使用 Generator Function。 以下是框架里解析 json payload 的實現: ~~~ think.middleware("parse_json_payload", http => { let types = http.config("post.json_content_type"); if (types.indexOf(http.type()) === -1) { return; } return http.getPayload().then(payload => { try{ http._post = JSON.parse(payload); }catch(e){} }); }); ~~~ ## 解析后賦值 有些 middleware 可能會解析相關的數據,然后希望重新賦值到?`http`?對象上,如:解析傳遞過來的 xml 數據,但后續希望可以通過?`http.get`?方法來獲取。 * `http._get`?用來存放 GET 參數值,http.get(xxx) 從該對象獲取數據 * `http._post`?用來存放 POST 參數值,http.post(xxx) 從該對象獲取數據 * `http._file`?用來存放上傳的文件值,http.file(xxx) 從該對象獲取數據 ~~~ think.middleware("parse_xml", http => { if (!http.payload) { return; } return parseXML(http.payload).then(data => { http._post = data; //將解析后的數據賦值給 http._post,后續可以通過 http.post 方法來獲取 }); }); ~~~ 關于?`http`?對象更多信息請見?[API -> http](https://thinkjs.org/zh-CN/doc/2.0/api_http.html)。 ## 阻止后續執行 有些 middleware 執行到一定條件時,可能希望阻止后面的邏輯繼續執行。如:IP 黑名單判斷,如果命中了黑名單,那么直接拒絕當前請求,不再執行后續的邏輯。 ThinkJS 提供了?`think.prevent`?方法用來阻止后續的邏輯執行執行,該方法是通過返回一個特定類型的 Reject Promise 來實現的。 ~~~ think.middleware("parse_xml", http => { if (!http.payload) { return; } var ip = http.ip(); var blackIPs = ["123.456.789.100", ...]; if(blackIPs.indexOf(ip) > -1){ http.end();//直接結束當前請求 return think.prevent(); //阻止后續的代碼繼續執行 } }); ~~~ 除了使用?`think.prevent`?方法來阻止后續邏輯繼續執行,也可以通過?`think.defer().promise`?返回一個 Pending Promise 來實現。 如果不想直接結束當前請求,而是返回一個錯誤頁面,ThinkJS 提供了?`think.statusAction`?方法來實現,具體使用方式請見?[擴展功能 -> 錯誤處理](https://thinkjs.org/zh-CN/doc/2.0/error_handle.html)。 ## 使用第三方 middleware 在項目里使用第三方 middleware 可以通過?`think.middleware`?方法來實現,相關代碼存放在`src/common/bootstrap/middleware.js`?里。如: ~~~ var parseXML = require("think-parsexml"); think.middleware("parseXML", parseXML); ~~~ 然后將?`parseXML`?配置到 hook 里即可。 * * * 項目里的一些通用 middleware 也推薦發布到 npm 倉庫中,middleware 名稱推薦使用?`think-xxx`。 ## 第三方 middleware 列表 第三方 middleware 列表請見?[插件 -> middleware](https://thinkjs.org/zh-CN/doc/2.0/plugin.html#middleware)。
                  <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>

                              哎呀哎呀视频在线观看