【问题标题】:What is the meaning of "bodyParser.urlencoded({ extended: true }))" and "bodyParser.json()" in Express.js?Express.js中的“bodyParser.urlencoded({extended: true }))”和“bodyParser.json()”是什么意思?
【发布时间】:2019-04-07 11:17:42
【问题描述】:
const bp = require("body-parser");
const express = require("express");
const app = express();

app.use(bp.json());
app.use(bp.urlencoded({ extended: true }));

我需要知道他们在做什么。我找不到任何详细信息。你能帮助我吗?还有extended:trueextended:false有什么区别

【问题讨论】:

标签: node.js


【解决方案1】:

body-parser 是一个 NPM 包,它在处理程序之前解析中间件中的传入请求主体,可在 req.body 属性下使用。

app.use(bp.json()) 查看存在Content-Type: application/json 标头的请求,并将基于文本的JSON 输入转换为req.body 下的JS 可访问变量。 app.use(bp.urlencoded({extended: true}) 对 URL 编码的请求执行相同的操作。 extended: true 精确到 req.body 对象将包含任何类型的值,而不仅仅是字符串。

【讨论】:

    【解决方案2】:

    body-parser 库的完整文档可以在here 找到。

    bp.json() - 用于解析 json 对象的中间件 - 可以在 here 找到选项。源码可以在here找到。

    返回只解析 JSON 并且只查看请求的中间件 其中 Content-Type 标头与 type 选项匹配。这个解析器 接受正文的任何​​ Unicode 编码并支持自动 gzip 和 deflate 编码的膨胀。

    bp.urlencoded({ extended: true }) - 用于从 URL 解析正文的中间件。选项可以找到here。源码可以在here找到。

    返回仅解析 {urlencoded} 主体且仅查找的中间件 在 Content-Type 标头与 type 选项匹配的请求中。 此解析器仅接受正文的 UTF-8 编码并支持 gzip 和 deflate 编码的自动膨胀。

    一个包含解析数据的新主体对象被填充到 中间件之后的请求对象(即req.body)。该对象将 包含键值对,其中值可以是字符串或数组 (当扩展为假时),或任何类型(当扩展为真时)。

    【讨论】:

    • 这篇文章中的答案都不令人满意。如果你想要一个正确的答案,请参考这篇文章 - stackoverflow.com/questions/29175465/…
    • 这是否意味着将解析字符串格式的数字?字符串fromat中的空值呢,它们也会被解析吗?
    【解决方案3】:

    在 Express >= 4.16 中,在 express.json() 方法下重新添加了正文解析器。 上述问题的替换是

    const express = require("express");
    
    const app = express();
    
    app.use(express.json());
    
    app.use(express.urlencoded({ extended: true }));
    

    扩展选项允许在使用 querystring 库(如果为 false)或 qs 库(如果为 true)解析 URL 编码数据之间进行选择。 “扩展”语法允许将丰富的对象和数组编码为 URL 编码格式,从而提供类似 JSON 的 URL 编码体验。更多信息请查看qs库here

    默认为 true,但不推荐使用默认值。请研究 qs 和 querystring 之间的区别并选择合适的设置。

    【讨论】:

      【解决方案4】:

      它可以帮助您从表单输入创建对象

        <input type="text" class="form-control" placeholder='Text' name="comment[text]" value="<%=comment.text%>">
      

      这两行将帮助您直接生成对象,而无需设置变量和创建自己的对象。如果您将扩展属性设置为 false,它将不会生成对象并将返回未定义。您自己尝试一下就会知道

      【讨论】:

      • 感谢您以人类可读的方式将其分解
      【解决方案5】:

      您不需要在 express 中使用require("body-parser")。因为来自 v4 的 express 已经实现了 body-parser。 你可以使用:

      app.use(express.json())
      app.use(express.urlencoded({extended: true}))
      

      是一样的。

      【讨论】:

        【解决方案6】:

        来自:https://apuntes.de/nodejs-desarrollo-web/body-parser/#gsc.tab=0

        > Extended false utiliza la librería querystring mientras que true la librería qs. La sintaxis de extended:true permite el uso de otras características como rich objects y arreglos codificados dentro del formato URL-encoded.
        

        意思是(大致翻译)

        extended *false* utilizes the library 'querystring' while *true* uses
         'qs'. The sintax in -extended:true- allows the use of other
         characteristics like rich objets & code arrengenment inside the
         URL-encoded format
        

        【讨论】:

          【解决方案7】:

          bodyparser 具有以下模式,解析数据来自 HTML 表单

          app.use(bp.urlencoded({ extended: true }));
          

          还可以解析文本、json等数据。

          app.use(bp.text({extend:true});
          app.use(bp.json({extend:true}); 
          

          【讨论】:

            猜你喜欢
            • 2023-01-30
            • 1970-01-01
            • 2016-08-19
            • 2015-07-11
            • 1970-01-01
            • 2016-08-30
            • 2012-03-12
            • 2011-04-14
            • 1970-01-01
            相关资源
            最近更新 更多