我在express.json()和express.urlencoded()上找不到任何文档。他们每个人到底做了什么?
答案 0 :(得分:8)
以下说明应清除对express.json()
和express.urlencoded()
以及body-parser的使用的疑问。我花了一些时间才弄清楚。
什么是中间件?正是那些在应用程序方法中处理请求并发送响应的方法/功能/操作。
在谈论express.json()
和express.urlencoded()
时,请特别考虑POST请求(即.post请求对象)和PUT请求(即.put请求对象)
对于GET请求或DELETE请求,您不需要express.json()
和express.urlencoded()
。
您需要express.json()
和express.urlencoded()
来进行POST和PUT请求,因为在这两个请求中,您都是发送数据(以某些数据对象的形式)到服务器,并且您要服务器接受或存储该数据(对象),该数据(对象)包含在该(POST或PUT)请求的正文(即req.body
)中
Express为您提供了中间件来处理请求正文中的(传入)数据(对象)。
a。 express.json()
是express中内置的一种方法,用于将传入的请求对象识别为 JSON对象。使用以下代码将这种方法称为应用程序中的中间件:app.use(express.json());
b。 express.urlencoded()
是express中内置的一种方法,用于将传入的请求对象识别为字符串或数组。使用以下代码将这种方法称为应用程序中的中间件:app.use(express.urlencoded());
或者,我建议使用 body-parser (这是一个NPM软件包)来执行相同的操作。它是由构建Express的同一位偷窥者开发的,旨在与Express配合使用。正文解析器曾经是express的一部分。考虑专门用于POST请求(即.post请求对象)和/或PUT请求(即.put请求对象)的正文解析器。
您可以在正文解析器中
// 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 }));
答案 1 :(得分:7)
json
和urlencoded
中间件都是bodyParser的一部分。这就是README所说的:
bodyParser([选项])
返回分析
json
和urlencoded
的中间件。options
将传递给两个中间件。bodyParser.json([选项])
返回仅解析
json
的中间件。选项包括:
strict
- 仅解析对象和数组limit
< 1mb> - 最大请求正文大小reviver
- 传递给JSON.parse()
bodyParser.urlencoded([选项])
返回仅使用qs模块解析
urlencoded
的中间件。选项包括:
limit
< 1mb> - 最大请求正文大小
答案 2 :(得分:5)
什么是中间件
要了解 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 中间件,可以将请求正文转换为 JSON。
express.urlencoded() 就像 express.json() 将请求体转换为 JSON,它还执行一些其他功能,例如:将表单数据转换为 JSON 等。
答案 3 :(得分:4)
如果你问我“express.urlencoded({extended: false}) 和 express.json() 之间的区别是什么? "
好吧,区别在于
如果你使用 express.json() 它将解析来自 html post 表单的 post/fetch 请求 except 的正文
它不会解析来自 html post 表单的信息
<form action="/" method="POST">
<input type="text" name="username">
<button>Submit</button>
</form>
例如,如果您在表单中填写“dean_ilham”然后提交,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_ilham"}
所以区别在于 express.json() 是用于发布请求的正文解析器除了 html 发布表单和 express.urlencoded({extended: false} ) 是 html post 表单的正文解析器
答案 4 :(得分:-11)
四处寻找答案,所以...
如果要自定义,请使用express.json或express.urlencoded,它们都在express中内置了中间件功能。
如果要快速开发,请使用body-Parser。