什么是 Express.json()和 Express.urlencode() ?

我找不到任何关于 express.json()express.urlencoded()的文档。它们各自具体做什么?

176409 次浏览

jsonurlencoded中间件都是 Body Parser的一部分:

Body 解析器([选项])

返回解析 jsonurlencoded的中间件。 options被传递给这两个中间件。

Json ([选项])

返回只解析 json的中间件。选项如下:

  • 仅解析对象和数组
  • limit < 1mb >-最大请求体积
  • 传给 JSON.parse()

Urlencode ([ options ])

返回只使用 QS模块解析 urlencoded的中间件:

  • limit < 1mb >-最大请求体积

下面是对 express.json()express.urlencoded()以及 body-parser 的使用应该澄清的疑问的解释。我花了点时间才想明白。

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

  2. 在讨论 express.json()express.urlencoded()时,要特别考虑 POST 请求(即。发布请求对象)和 PUT 请求(即。放入请求对象)

  3. 获取请求或删除请求不需要 express.json()express.urlencoded()

  4. 对于 POST 和 PUT 请求,您需要 express.json()express.urlencoded(),因为在这两个请求中,您是服务器的 发送数据(以某种数据对象的形式) ,并且您要求服务器接受或存储该数据(对象) ,该数据(对象)包含在该(POST 或 PUT)请求的主体(即 req.body)中

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

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

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

  6. 或者,我建议使用 身体解析器(它是一个 NPM 包)来做同样的事情。它是由建造快递的同一批人开发的,并且被设计用于与快递一起工作。Body-parser 曾经是 Express 的一部分。考虑专门针对 POST 请求的 body-parser (即。发布请求对象)和/或 PUT 请求(即。放入请求对象)。

  7. 在 body-parser 中你可以做

    // 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 }));
    

什么是中间件

为了理解 Express.json 和 Express.urlencode 的功能,您必须理解中间件是什么。

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

现在您应该知道如何使用 Express 将请求发送到路由。

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

Middleware 的重要性

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

中间件在这个阶段发挥了作用,中间件就像是每个请求的接收者。

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

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

Builtin Middleware

现在 ExpressJS 已经制作了一些中间件来帮助开发人员完成一些繁琐的任务。比如将请求体转换为 JSON 等等。

这些内置 ExpressJS 中间件的示例如下

  • Express.json ()
  • Urlencode ()

JSON () 是一个构建的 Express 中间件,可以将请求体转换为 JSON。

Urlencode () 就像 Express.JSON ()将请求体转换为 JSON 一样,它也执行一些其他功能,如: 将表单数据转换为 JSON 等。

如果你问我“ express.urlencoded({extended: false})express.json()之间的 不同是什么”,那么,区别就是:

  • express.json()

如果使用 express.json(),它将从 html post 表单中解析 post/take 请求 除了的主体。它不会解析 html 邮寄表单中的信息:

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

例如,如果你用“ dean”填写表单,然后提交它,Express 就不会知道用这个快捷代码在身体内部会发生什么:

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

所以不同之处在于 express.json()是用于 html 文章表单的主体解析器,而 express.urlencoded({extended: false})是用于 html 文章表单的主体解析器。

这个中间件可以在 Express V4.16.0中找到。

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

Tended [ boolean ] : 这个选项允许在解析使用 querystring 库(当为 false 时)的 URL 编码数据和使用 qs 库(当为 true 时)的数据之间进行选择。“扩展”语法允许将富对象和数组编码为 URL 编码格式,允许使用 URL 编码的类似 JSON 的体验

快递文件:-https://expressjs.com/en/api.html#express.urlencoded

当你使用 post 方法提交表单时(默认的 content-type = application/x-www-form-urlencode) ,你需要使用 req.body 来访问表单数据,如果你不使用 req.body,那么 req.body 将是未定义的。