jit*_*ten 289 node.js express body-parser
我不明白为什么我们需要body-parser
在Express应用程序中,因为我们可以在不使用的情况下获取数据body-parser
.它实际上做了什么以及如何做?
Mal*_*til 211
要处理Express.js版本4及更高版本中的HTTP POST
请求,您需要安装名为的中间件模块.body-parser
body-parser
提取传入请求流的整个正文部分并将其公开req.body
.
中间件早先是Express.js的一部分,但现在你必须单独安装它.
该body-parser
模块解析使用HTTP POST
请求提交的JSON,缓冲区,字符串和URL编码数据.body-parser
使用NPM 安装,如下所示.
npm install body-parser --save
Run Code Online (Sandbox Code Playgroud)
Him*_*rma 64
是的,我们可以不用body-parser
.执行此操作时,您将获得原始请求,并且您的正文和标题不在根对象中.您将不得不单独操纵所有字段.
或者你可以使用body-parser
,因为快递团队正在维护它.
身体解析器可以为您做什么:它简化了请求.
如何使用它:以下是示例:
安装 npm install body-parser --save
这个如何在express中使用body-parser:
const express = require('express'),
app = express(),
bodyParser = require('body-parser');
// support parsing of application/json type post data
app.use(bodyParser.json());
//support parsing of application/x-www-form-urlencoded post data
app.use(bodyParser.urlencoded({ extended: true }));
Run Code Online (Sandbox Code Playgroud)
链接.
https://github.com/expressjs/body-parser.
Sur*_*ain 51
这里的答案解释得非常详细和出色,答案包含:
简而言之; body-parser提取传入请求流的整个正文部分,并将其公开
req.body
为更易于与之交互的内容.你本身并不需要它,因为你可以自己完成所有这些.但是,它很可能会做你想要的并省去你的麻烦.
更深入一点; body-parser为您提供了一个中间件,它使用nodejs/zlib解压缩传入的请求数据(如果它是压缩的)和stream-utils/raw- body在"解析它"之前等待请求正文的完整原始内容(这意味着如果你不打算使用请求体,你只是浪费了一些时间).
拥有原始内容后,body-parser将使用四种策略之一解析它,具体取决于您决定使用的特定中间件:
bodyParser.raw() :实际上并没有解析身体,但是从之前只是暴露了缓冲了内容在缓存上
req.body
.bodyParser.text():以纯文本形式读取缓冲区,并在req.body上公开生成的字符串.
bodyParser.urlencoded():将文本解析为URL编码数据(这是浏览器倾向于将表单数据从常规表单发送到POST的方式)并公开生成的对象(包含键和值)
req.body
.为了比较; 在PHP中,所有这些都是自动完成并公开的$_POST
.bodyParser.json():将文本解析为JSON并公开生成的对象
req.body
.只有在设置了
req.body
所需内容后,它才会调用堆栈中的下一个中间件,然后可以访问请求数据,而无需考虑如何解压缩和解析它.
您可以参考body-parser github来阅读他们的文档,它包含有关其工作的信息.
小智 36
让我们试着保持最低技术性.
假设您正在向node-js服务器发送html表单数据,即您向服务器发出了请求.服务器文件将在请求对象下接收您的请求.现在通过逻辑,如果你控制台在服务器文件中记录这个请求对象,你应该看到你的表单数据在哪里,然后可以提取,但是谁!你实际上没有!
那么,我们的数据在哪里?如果它不仅出现在我的请求中,我们将如何提取它.
对此的简单解释是,http发送您的表单数据,这些数据旨在在到达目的地时进行组合.那么你将如何提取数据?
但是,为什么每次都要手动解析数据并将其组装起来.使用一种叫做"身体解析器"的东西来为你做这件事.
body-parser解析您的请求并将其转换为一种格式,您可以从中轻松提取您可能需要的相关信息.
例如,假设您的前端有一个注册表单.您正在填写它,并请求服务器在某处保存详细信息.
如果您使用正文解析器,从您的请求中提取用户名和密码就像下面一样简单.
var loginDetails = {
username : request.body.username,
password : request.body.password
};
Run Code Online (Sandbox Code Playgroud)
所以基本上,body-parser解析了你的传入请求,组装了包含你的表单数据的块,然后为你创建了这个body对象并用你的表单数据填充它.
May*_*yur 16
Express 的早期版本曾经捆绑了很多中间件。bodyParser
是它附带的中间件之一。当 Express 4.0 发布时,他们决定从 Express 中删除捆绑的中间件,并将它们制成单独的包。安装模块后,语法从app.use(express.json())
变为。app.use(bodyParser.json())
bodyParser
bodyParser
在 4.16.0 版本中被重新添加到 Express 中,因为人们希望它像以前一样与 Express 捆绑在一起。bodyParser.json()
这意味着如果您使用的是最新版本,则无需再使用。你可以用express.json()
它代替。
有兴趣的人可以在这里查看 4.16.0 的发布历史记录,也可以在这里获取拉取请求。
好了,回到正题,
您只需添加即可,
app.use(express.json());
app.use(express.urlencoded({ extended: true}));
Run Code Online (Sandbox Code Playgroud)
在路线声明之前,而不是,
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
Run Code Online (Sandbox Code Playgroud)
Express 将满足您的要求。:)
完整的例子看起来像,
const express = require('express')
const app = express()
app.use(express.json())
app.use(express.urlencoded({ extended: true}));
app.post('/test-url', (req, res) => {
console.log(req.body)
return res.send("went well")
})
app.listen(3000, () => {
console.log("running on port 3000")
})
Run Code Online (Sandbox Code Playgroud)
它解析HTTP请求体.当您需要了解的不仅仅是您点击的URL时,这通常是必需的,特别是在POST或PUT PATCH HTTP请求的上下文中,您需要的信息包含在正文中.
基本上它是一个中间件,用于解析JSON,纯文本,或者只是返回一个原始的Buffer对象,供您根据需要进行处理.
了解请求正文
接收 POST 或 PUT 请求时,请求正文可能对您的应用程序很重要。获取正文数据比访问请求标头要复杂一些。传入处理程序的请求对象实现了 ReadableStream 接口。可以像任何其他流一样在其他地方收听或通过管道传输此流。我们可以通过监听流的 'data' 和 'end' 事件直接从流中获取数据。
每个“数据”事件中发出的块是一个缓冲区。如果您知道它将是字符串数据,最好的做法是将数据收集到一个数组中,然后在“末尾”将其连接并字符串化。
Run Code Online (Sandbox Code Playgroud)let body = []; request.on('data', (chunk) => { body.push(chunk); }).on('end', () => { body = Buffer.concat(body).toString(); // at this point, `body` has the entire request body stored in it as a string });
理解身体解析器
根据其文档
在处理程序之前在中间件中解析传入的请求正文,在 req.body 属性下可用。
正如您在第一个示例中看到的,我们必须手动解析传入的请求流以提取正文。当有多个不同类型的表单数据时,这变得有点乏味。所以我们使用 body-parser 包来完成所有这些任务。
它提供了四个模块来解析不同类型的数据
在拥有原始内容后,正文解析器将使用上述策略之一(取决于您决定使用的中间件)来解析数据。您可以通过阅读他们的文档来了解更多关于他们的信息。
设置req.body
为解析后的 body 后,body-parser 会调用next()
栈向下调用下一个中间件,这样就可以访问请求数据,而无需考虑如何解压和解析。
如果你不想使用单独的 npm 包 body-parser,latest express (4.16+) 内置了 body-parser 中间件,可以这样使用,
const app = express();
app.use(express.json({ limit: '100mb' }));
Run Code Online (Sandbox Code Playgroud)
ps 并非身体解析的所有功能都存在于快递中。请在此处参阅文档以了解完整用法
这些都是方便的问题.
基本上,如果问题是"我们需要使用body-parser
吗?" 答案是不'.我们可以使用更加迂回的路径从客户端发布请求中获取相同的信息,这些路径通常不太灵活,并且会增加我们必须编写的代码量以获取相同的信息.
这是一种同为询问"我们需要使用express
到开始?再一次,答案是否定的,真的,这一切都归结为拯救我们编写更多代码以执行"内置"所表达的基本事物的麻烦.
从表面上看 - body-parser
更容易以各种格式获取客户端请求中包含的信息,而不是让您捕获原始数据流并确定信息的格式,更不用说手动将信息解析为可用数据.
把事情简单化 :
post
请求,那么您将需要body
请求的 ,因此您将需要body-parser
。express
,但use
如果你会收到 post 请求,你必须安装它。app.use(bodyParser.urlencoded({ extended: false }));
{ extended: false }
Run Code Online (Sandbox Code Playgroud)
false 的意思是,您的body对象中没有嵌套数据。需要注意的是:请求数据作为主体对象嵌入到请求中。
归档时间: |
|
查看次数: |
211376 次 |
最近记录: |