2016-07-11 18 views
97

我不明白为什么我们在Express应用程序中需要body-parser,因为我们可以在不使用body-parser的情况下获取数据。 它究竟有什么作用?身体语法分析器用表达式做什么?

+12

为了读取HTTP POST数据,我们必须使用“身体分析器”节点模块。 body-parser是一个快速中间件,它读取表单的输入并将其存储为可通过'req.body'访问的javascript对象 – refactor

+1

使用express可以读取HTTP请求中的任何数据,例如头文件'req.headers' (数组),你可以通过@CleanCrispCode读取http数据包的主体为'req.body',你可以读取查询参数'req.query.variable',它有助于自动转换请求在javascript对象中的帮助。 –

+0

检查我的答案,也许它会帮助你 –

回答

8

以为这是一个老问题,但它可能会帮助别人,而不是使用bodyParser中间件从表达我们可以使用这些工具。

如果您想解析端点中的json,请使用express.json()中间件。如果您想要json和urlencoded端点,请使用[express.json(), express.urlencoded()]作为中间件。

如果您希望用户上传文件到您的端点,您可以使用express.multipart(),并确保清理所有创建的临时文件。

+9

林学习和思想实施这个战略看到如何我不愿意添加更多的模块和其他东西,如果明确已经有它,但事实证明,它不再与快递捆绑,必须单独安装。 只是把这里更新的信息。 – somdow

47

Express.js 4版处理HTTP POST请求及以上,你需要安装一个名为body-parser中间件模块。

body-parser提取传入请求流的整个主体部分并在req.body上公开它。

中间件早些时候是Express.js的一部分,但现在您必须单独安装它。

body-parser模块解析使用HTTP POST请求提交的JSON,缓冲区,字符串和URL编码数据。使用NPM安装body-parser,如下所示。

npm install body-parser --save 
3

为了访问发布的数据,我们必须使用body-parser。基本上什么body-parser是允许明确读取身体,然后解析成我们可以理解的对象Json

4

它解析HTTP请求主体。当您需要知道的不仅仅是您所访问的URL时,这通常是必需的,特别是在POST或PUT PATCH HTTP请求的上下文中,您希望的信息包含在正文中。

基本上它是一个解析JSON,纯文本或者只是返回原始Buffer对象的中间件,供您根据需要进行处理。

3

这些都是为了方便。

基本上,如果问题是'我们需要使用body-parser?'答案是不'。我们可以从客户请求中获得相同的信息,使用更加迂回的路线,这种路线通常不那么灵活,并且会增加我们编写的代码数量以获得相同的信息。

这是一样的问'我们需要使用express开始?'再次,答案是没有,并且再次,实际上,这归结于为我们节省编写更多代码以执行“内置”所表达的基本内容的麻烦。

表面上 - body-parser可以更容易地以各种格式获取客户端请求中包含的信息,而不是使您捕获原始数据流并确定信息的格式,更不用说手动解析信息转换为可用数据。

3

答案here解释很详细,精辟,答案包括:

在短; body-parser提取传入请求流的整个正文部分,并将其公开在req.body上,因为它更易于与界面交互。你本身并不需要它,因为你可以自己做所有这些。但是,它很可能会做你想做的事情,并为你节省麻烦。


要深入一点; body-parser为您提供了一个中间件,它使用nodejs/zlib来解压缩传入的请求数据(如果它被压缩),并且stream-utils/raw-body在“解析它”之前等待请求主体的完整原始内容(这意味着如果您不打算使用请求机构,你只是浪费了一些时间)。

其原始内容后,身体解析器将使用它的四个战略之一,这取决于具体的中间件解析您决定使用:

  • bodyParser.raw():实际上并没有解析身体,但只是在req.body上的Buffer中公开缓冲起来的内容。

  • bodyParser.text():以纯文本形式读取缓冲区,并将req.body中的结果字符串公开。

  • bodyParser.urlencoded():将文本解析为URL编码数据(这是浏览器倾向于将常规表单设置为POST的形式数据发送方式),并在req.body上显示生成的对象(包含键和值)。为了比较;在PHP中,所有这些都会自动完成并在$_POST中公开。

  • bodyParser.json():将文本解析为JSON并在req.body上公开结果对象。

只有设置req.body到理想的内容将其调用堆栈中的下一个中间件,那么它可以访问请求的数据,而不必考虑如何解压和解析之后。

你可以参考身体解析器github阅读他们的文档,它包含有关其工作的信息。

0

是的,我们可以在没有body-parser的情况下工作。当你这样做时,你会得到原始请求,并且你的body和headers不在根对象中。你将不得不单独操纵所有的领域。您可以使用body-parser,因为快递团队正在维护它。

什么身体分析器可以为您做:它简化了请求。
如何使用它:这里是例子:

安装npm install body-parser --save

该如何利用身体的解析器快递:

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

链接。

https://github.com/expressjs/body-parser