express.json() 和 express.urlencoded() 是什么?

IT技术 javascript node.js express
2021-02-27 10:41:33

我在express.json()上找不到任何文档express.urlencoded()他们每个人具体做什么?

6个回答

下面是应该清除疑虑的解释express.json()express.urlencoded()和使用身体解析器。我花了一些时间才弄明白这一点。

  1. 什么是中间件?这些方法/函数/操作被称为 BETWEEN 处理请求并在您的应用程序方法中发送响应。

  2. 在谈论express.json()express.urlencoded()思考 POST 请求(即 .post 请求对象)和 PUT 请求(即 .put 请求对象)时

  3. 你不需要express.json()express.urlencoded()GET请求或删除请求。

  4. 你需要express.json()express.urlencoded()针对POST和PUT请求,因为在这两个请求你发送的数据(一些数据对象的形式)发送到服务器和你所要求的服务器来接受或存储的数据(对象),其被封闭在该req.body(POST 或 PUT)请求的正文(即

  5. Express 为您提供了中间件来处理请求正文中的(传入)数据(对象)。

    一个。express.json()是 express 中内置的一种方法,用于将传入的请求对象识别为JSON 对象此方法在您的应用程序中使用以下代码作为中间件调用:app.use(express.json());

    express.urlencoded()是 express 中内置的一种方法,用于将传入的请求对象识别为字符串或数组此方法在您的应用程序中使用以下代码作为中间件调用:app.use(express.urlencoded());

  6. 或者,我建议使用body-parser(它是一个 NPM 包)来做同样的事情。它是由构建 express 的同一批人开发的,旨在与 express 一起工作。body-parser 曾经是 express 的一部分。考虑专门用于 POST 请求(即 .post 请求对象)和/或 PUT 请求(即 .put 请求对象)的 body-parser。

  7. 在身体解析器中,你可以做

    // calling body-parser to handle the Request Object from POST requests
    var bodyParser = require('body-parser');
    // parse application/json, basically parse incoming Request Object as a JSON Object 
    app.use(bodyParser.json());
    // parse application/x-www-form-urlencoded, basically can only parse incoming Request Object if strings or arrays
    app.use(bodyParser.urlencoded({ extended: false }));
    // combines the 2 above, then you can parse incoming Request Object if object, with nested objects, or generally any type.
    app.use(bodyParser.urlencoded({ extended: true }));
    
不推荐使用 body-parser。我们应该使用内置的 express 方法。
2021-04-25 10:41:33
@VirajSingh 这意味着 bodyParser 将使用 lib qs如果设置为 false 它将使用 查询字符串
2021-04-28 10:41:33
如果您使用 Express >= 4.16.0,则在 methodsexpress.json()下重新添加了正文解析器express.urlencoded()
2021-05-04 10:41:33
app.use(bodyParser.urlencoded({ extended: true }));不组合app.use(bodyParser.json());app.use(bodyParser.urlencoded({ extended: false }));:它不处理 application/json 而只处理 application/x-www-form-urlencoded。这些extended选项用于指定bodyParser 是否应使用qs( extended: true) 或querystring( extended: false)解析 URL 编码的数据
2021-05-17 10:41:33
@Kleber Germano 在哪种情况下 {extend: true} 选项或使用 'qs' 而不是 'querystring' 会更可取?
2021-05-21 10:41:33

jsonurlencoded中间件是两部分bodyParser这是自述文件所说的:

bodyParser([选项])

返回解析json和 的中间件urlencodedoptions被传递到两个中间件。

bodyParser.json([选项])

返回仅解析json. 选项是:

  • strict - 只解析对象和数组
  • limit <1mb> - 最大请求正文大小
  • reviver - 传递给 JSON.parse()

bodyParser.urlencoded([选项])

返回仅urlencoded使用qsmodule解析的中间件选项是:

  • limit <1mb> - 最大请求正文大小
只要记住带有该选项的 bodyParser.urlencodedextended = false 将使用库查询字符串eg:bodypParser.urlencoded({ extended: false }) //querystring 和库qs 如果扩展选项设置为 true eg: bodypParser.urlencoded({ extended: true }) //qssource here
2021-05-15 10:41:33

如果你问我“有什么区别之间express.urlencoded({延长:假})express.json()

嗯,区别在于

如果您使用express.json()它将解析来自 post/fetch 请求的正文,除了html post 表单

它不会解析来自 html帖子表单的信息

<form action="/" method="POST">
    <input type="text" name="username">
    <button>Submit</button>
</form>

例如,如果你用“dean_ilham”填写表格然后提交它,表达不会知道身体里面是什么。

使用快递代码:

const express = require('express')
const app = express()

app.use(express.json())
// app.use(express.urlencoded({ extended: false }))
app.use(express.static("public"))


app.get("/", (req, res) => {
    res.sendFile("index.html")
})

app.post("/", (req, res) => {
    res.send(req.body)
})


const port = process.env.PORT || 3001
app.listen(port, () => {
    console.log(`Server Up in Port ${port}`);
})

它会{}在您点击提交后发送

但如果你取消注释app.use(express.urlencoded({extended: false})),那么你会得到{"username": "dean_ilham"}

所以区别在于express.json()除了html post 表单之外的post 请求的正文解析器,express.urlencoded({extended: false})是 html post 表单的正文解析器

什么是中间件

要了解 express.json 和 express.urlencoded 的作用,您必须了解中间件是什么。

中间件是 expressJS 中的函数或方法,用于对向服务器发出的请求执行各种操作。

到现在为止,您应该知道如何使用 express 获取对路由的请求。

app.get("/api/houses", (req, res) => {
     console.log("Received request");
     res.send("houses")
   })

中间件的重要性

上面的代码是 express 如何处理 get 请求的典型示例。但是在您希望对向服务器发出的每个请求进行操作的情况下。您不希望在每条路线中都重复代码。

在这个阶段,一个中间件可以派上用场。中间件就像每个请求的通用接收器。

app.use((req, res, next) => {
      console.log("Verifing request"); 
      next();
     })

以上是一个自定义中间件,它验证对我的服务器发出的每个请求,并根据请求的类型将广告发送到下一个适当的路由中间件。(获取、发布、放置等)

内置中间件

现在 expressJS 已经有一些已经制作好的中间件,可以帮助开发人员执行一些繁琐的任务。比如将请求正文转换为 JSON 等等。

这些内置 ExpressJS 中间件的示例是

  • express.json()
  • express.urlencoded()

express.json()是一个内置的 express 中间件,可以将请求体转换为 JSON。

express.urlencoded()就像 express.json() 将请求正文转换为 JSON,它还执行一些其他功能,例如:将表单数据转换为 JSON 等。

我认为没有必要,但大多数时候,我总是将两者相加。
2021-04-28 10:41:33
所以如果我使用 express.urlencoded() ,我是否需要再次添加 express.json() ?
2021-05-20 10:41:33

这个中间件在 Express v4.16.0以后可用

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

extended[boolean]:此选项允许在使用查询字符串库(当为假)或 qs 库(当为真)解析 URL 编码数据之间进行选择。“扩展”语法允许将丰富的对象和数组编码为 URL 编码格式,从而实现类似 JSON 的 URL 编码体验

表达文档:- https://expressjs.com/en/api.html#express.urlencoded