<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國際加速解決方案。 廣告
                [TOC] ## 介紹 在處理函數前轉換得到的請求體,使得 req.body屬性可用的中間件。 > 由于req.body的基于用戶控制的輸入,此對象中的所有屬性和值都是不可信的,應在信任之前進行驗證。 例如,req.body.foo.toString()可能會以多種方式失敗,例如foo屬性可能不存在,也可能不是字符串,并且toString可能不是函數,而是字符串或其他用戶輸入。 > > 常見的四種Content-Type類型: > * application/x-www-form-urlencoded 常見的form提交 > * multipart/form-data 文件提交 > * application/json 提交json格式的數據 > * text/xml 提交xml格式的數據 這個中間件不會解析multipart body,由于這種消息體很復雜而且也很大。對于multipart bodies,可以使用以下中間件: * busboy and connect-busboy * multiparty and connect-multiparty * formidable * multer 本模塊提供了以下解析器 * JSON體解析器 * Raw解析器 * Text解析器 * URL-encoded form 解析器 可以通過body-parser 對象創建中間件,當接收到客戶端請求時所有的中間件都會給req.body 添加屬性,請求體為空,則解析為空{} (或者出現錯誤)。 ## bodyParser.json([options]) 返回只解析json的中間件,只查看Content-Type類型匹配type選項。允許請求體任意Unicode編碼,支持 gzip 和 deflate 編碼。 **選項** inflate 默認為true。當設置為true,被deflate(壓縮)的請求體會被inflated,為false時,不會deflated 請求體。 limit 控制請求體最大大小,默認為100kb,當為數字時會轉換為bytes,當為字符串時,value值會通過 bytes庫 轉換為字節大小。 reviver 此選項會通過JSON.parse直接傳給其第二個參數。 strict 默認為true,當為true時只接受數組和對象,當為false時會接受任何JSON.parse 能接受的。 type type 選項用來決定中間件要解析媒體類型,默認為application/json。選項可以是一個字符串、字符串數組或函數。當為字符串時,可以直接通過type-is 庫直接傳遞給選項,字符串也可以為一個擴展名(例如json)、mime 類型(application/json、/ 、*/json)。 verify verify選項,若缺失則為一個函數function(req,res,buf,encoding),buf為一個Buffer。 ## bodyParser.raw([options]) 將請求體內容作為 Buffer 來處理,并返回。支持gzip deflate 壓縮。 inflate 默認為true。當設置為true,被deflate(壓縮)的請求體會被inflated,為false時,不會deflated 請求體。 limit 控制請求體最大大小,默認為100kb,當為數字時會轉換為bytes,當為字符串時,value值會通過 bytes庫 轉換為字節大小。 reviver 此選項會通過JSON.parse直接傳給其第二個參數。 strict 默認為true,當為true時只接受數組和對象,當為false時會接受任何JSON.parse 能接受的。 type type 選項用來決定中間件要解析媒體類型,默認為application/octet-stream。選項可以是一個字符串、字符串數組或函數。 若不是函數,type 選項傳遞到type-is 庫,它可以說擴展名(如 bin),mime 類型(如 application/octet-stream)或者帶通配符的mine type(如*/* or application/*)。 如果函數,type選項會以fn(req)執行并且如果返回真值請求會被轉換。 verify verify選項,若缺失則為一個函數function(req,res,buf,encoding),buf為一個Buffer。 ## bodyParser.raw([options]) 將請求提內容作為字符串來處理,并返回。支持gzip deflate 壓縮。 ## bodyParser.urlencoded([options]) 中間件只解析urlencoded 請求體,并返回,只支持UTF-8編號,支持gzip deflate 壓縮。 **選項** extended 若為true,使用qs庫轉換URL-encoded data,為false則使用querystring庫。extended符號允許富對象和數組被編碼為URL-encoded的類型,也可以是一個JSON編碼的數據。 默認值為true,但使用默認值已經不贊成。請研究 qs 和 querystring的區別并選擇合適的設置。 inflate 控制請求體最大大小,默認為100kb,當為數字時會轉換為bytes,當為字符串時,value值會通過 bytes庫 轉換為字節大小。 limit 控制請求體最大大小,默認為100kb,當為數字時會轉換為bytes,當為字符串時,value值會通過 bytes庫 轉換為字節大小。 parameterLimit 指定URL-encoded數據中parameters最長長度,若請求包含的parameter大于此數,返回413到客戶端。默認1000。 type type 選項用來決定中間件要解析媒體類型,默認為application/x-www-form-urlencoded。選項可以是一個字符串、字符串數組或函數。 若不是函數,type 選項傳遞到type-is 庫,它可以說擴展名(如 urlencoded),mime 類型(如 application/x-www-form-urlencoded)或者帶通配符的mine type(如application/x-www-form-urlencoded)。 如果函數,type選項會以fn(req)執行并且如果返回真值請求會被轉換。 verify verify選項,若缺失則為一個函數function(req,res,buf,encoding),buf為一個Buffer。 ## querystring與qs ### querystring querystring就是nodejs內建的對象之一,用來字符串化對象或解析字符串。如 ~~~ querystring.parse("name=henry&age=30") => { name: 'henry', age: '30' } ~~~ ### qs qs是一個querystring的庫,在qs的功能基礎上,還支持更多的功能并優化了一些安全性。比如,對象解析的支持: ~~~ // 內建對象 querystring querystring.parse("info[name]=henry&info[age]=30&hobby[1]=sport&hobby[2]=coding") => { 'info[name]': 'henry', 'info[age]': '30', 'hobby[1]': 'sport', 'hobby[2]': 'coding' } // 第三方插件 qs qs.parse("info[name]=henry&info[age]=30&hobby[1]=sport&hobby[2]=coding") => { info: { name: 'henry', age: '30' }, hobby: [ 'sport', 'coding' ] } ~~~ querystring并不能正確的解析復雜對象(多級嵌套),而qs卻可以做到。 但是qs也不是萬能的,對于多級嵌套的對象,qs只會解析5層嵌套,超出的部分會表現的跟本文頭部的那種情況一樣;對于數組,qs最大只會解析20個索引,超出的部分將會以鍵值對的形式解析。 理論上來說,form表單提交不會有多級嵌套的情況,而urlencoded本身也是form的內容類型,因此,bodyParser.urlencoded不支持多級嵌套也是很合理的設計。 那么,如果我們非要上傳一個十分復雜的對象,應該怎么辦? ### 解決方案 ## 用例 在express項目中,通常順序調用body-parser所提供的parser,這樣當一個parser無法滿足post參數解析條件時,還可以使用另一個parser進行解析(在某些特殊的請求中,有可能所有parser均無法解析)。 ~~~ app.use(bodyParser.raw()); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false }); ~~~ 但body-parser的各個parser在解析的過程中,若對滿足解析條件的post參數進行了解析,req作為一個stream對象,已經被消耗,無法再使用另一個parser對post參數解析,也即post參數只能被第一個滿足解析條件的parser進行解析。因此即使先后調用raw、json、urlencoded這三個parser,也只能得到一個body,具體格式由各parser的調用次序及post參數滿足的解析條件決定。JSON化的body和raw body如同魚與熊掌,二者不可得兼。 但在有些場合下,可能需要在解析body的同時使用raw body進行其他操作,如某些應用場景下就需要使用raw body參與簽名運算以對訪問者進行鑒權。 其實body-parser提供了一個辦法在解析post參數的同時獲取raw body,那就是在調用parser的時候傳入的參數中帶verify回調函數: ~~~ app.use(bodyParser.json({ verify: function (req, res, buf, encoding) { req.rawBody = buf; } })); app.use(bodyParser.urlencoded({ extended: false, verify: function (req, res, buf, encoding) { req.rawBody = buf; } })); ~~~ verify參數本身是用于對請求的校驗,當校驗失敗的時候通過拋出error來中止body-parser的解析動作,在這里被借用來實現post參數raw body的獲取。 這樣一來,在將post參數解析成JSON化的req.body的同時,body-parser還會將raw body賦值給req.rawBody(當然,內存也占用了兩份,這是需要注意的地方,如果應用中有大數據量的POST請求,那可就要注意了)。 ## 參考資料 [bodyParser中間件的研究](https://segmentfault.com/a/1190000004407008) [如何在nodejs express項目中使用body-parser的同時獲取JSON化的body和raw body](https://segmentfault.com/a/1190000003061925)
                  <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>

                              哎呀哎呀视频在线观看