身体解析器对表达有什么作用?

时间:2016-07-11 12:08:39

标签: node.js express body-parser

我不明白为什么我们在Express应用程序中需要body-parser,因为我们可以在不使用body-parser的情况下获取数据。 它实际上做了什么以及如何做到了?

10 个答案:

答案 0 :(得分:169)

要在 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

在2019年4月2日编辑 在express@4.16.0中,body-parser中间件捆绑了express。 for more details see this

答案 1 :(得分:43)

是的,我们可以在没有{path:'signup',component:VendorRegistrationComponent,resolve:{userdata:ServiceResolve}}, 的情况下工作。当您不使用它时,您将获得原始请求,并且您的正文和标题不在请求参数的根对象中。您必须单独操作所有字段。

或者您可以使用body-parser,因为快速团队正在维护它。

身体解析器可以为您做什么:它简化了请求 如何使用它:以下是示例:

安装body-parser

这个如何在express中使用body-parser:

npm install body-parser --save

链接。

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

答案 2 :(得分:39)

答案here解释得非常详细和出色,答案包含:

  

总之; body-parser 提取传入请求流的整个正文部分,并在req.body上公开它,以便更容易与之交互。你本身并不需要它,因为你可以自己完成所有这些。但是,它很可能会做你想要的并省去你的麻烦。

           

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

     

获取原始内容后,body-parser将使用四种策略之一解析它,具体取决于您决定使用的特定中间件:

     
      
  • bodyParser.raw():实际上并不解析正文,只是在req.body req.body上公开之前缓存的内容。

  •   
  • Buffer:以纯文本形式读取缓冲区,并在req.body上公开生成的字符串。

  •   
  • bodyParser.text():将文本解析为URL编码数据(这是浏览器倾向于将表单数据从常规表单发送到POST的方式)并在{上显示结果对象(包含键和值) {1}}。为了比较;在PHP中,所有这些都是自动完成的,并在$_POST

  • 中公开   
  • bodyParser.urlencoded():将文本解析为JSON,并在req.body上公开生成的对象。

  •   
     

只有在将req.body设置为所需内容后,它才会调用堆栈中的下一个中间件,然后可以访问请求数据,而无需考虑如何解压缩和解析它。

您可以参考 body-parser bodyParser.json()来阅读他们的文档,其中包含有关其工作的信息。

答案 3 :(得分:25)

让我们尽量保持最低的技术水平。

假设您正在将HTML表单数据发送到node-js服务器,即您向服务器发出了请求。服务器文件将在请求对象下接收您的请求。现在按逻辑,如果您在服务器文件中控制台记录此请求对象,则应该在其中的某些位置看到表单数据,然后可以将其提取出来,但是哇!你实际上不!

那么,我们的数据在哪里?如果它不仅出现在我的请求中,我们将如何提取它。

对此的简单解释是http以分段形式发送表单数据,目的是在到达目的地时进行组装。那么您将如何提取数据。

但是,为什么要每次手动手动分析数据并将其组装起来却费心。使用一种叫做“ body-parser”的东西可以为您做到这一点。

body-parser解析您的请求并将其转换为一种格式,您可以从中轻松提取您可能需要的相关信息。

例如,假设您在前端有一个注册表格。您正在填充它,并请求服务器将详细信息保存在某处。

如果使用body-parser,从请求中提取用户名和密码非常简单。

var loginDetails = {    
    username : request.body.username,    
    password : request.body.password    
};

因此,基本上,body解析器解析您的传入请求,组装包含表单数据的块,然后为您创建此body对象并用表单数据填充它。

答案 4 :(得分:9)

它解析HTTP请求正文。当您需要了解的不仅仅是您点击的URL时,这通常是必需的,特别是在POST或PUT PATCH HTTP请求的上下文中,您需要的信息包含在正文中。

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

答案 5 :(得分:7)

为了访问帖子数据,我们必须使用1。基本上body-parser允许表达读取正文然后将其解析为我们可以理解的body-parser对象。

答案 6 :(得分:7)

这些都是为了方便起见。

基本上,如果问题是“我们需要使用body-parser吗?”答案是不'。我们可以使用更加迂回的路径从客户端发布请求中获取相同的信息,这些路径通常不太灵活,并且会增加我们必须编写的代码量以获取相同的信息。

这与询问'我们需要使用express开头吗?同样,答案是否定的,而且,真的一切都归结为拯救我们编写更多代码以执行“内置”所表达的基本事物的麻烦。

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

答案 7 :(得分:3)

如果您不想使用单独的npm包body-parser,最新的express(4.16+)具有内置的body-parser中间件,可以像这样使用,

const app = express();
app.use(express.json({ limit: '100mb' }));

p.s。并不是所有的正文解析功能都存在于Express中。有关完整用法,请参阅文档here

答案 8 :(得分:2)

了解请求正文

  

接收到POST或PUT请求时,请求正文可能是   对您的应用很重要。获取身体数据有点   比访问请求标头更复杂。请求对象   传递给处理程序的实现了ReadableStream接口。   就像在其他地方一样,可以在其他地方收听或传送此流   流。我们可以通过收听以下内容直接从流中获取数据   流的“数据”和“结束”事件。

     

每个“数据”事件中发出的块是一个缓冲区。如果你知道   将是字符串数据,最好的办法是收集数据   数组,然后在“末尾”将其连接并字符串化。

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软件包在后台执行所有任务。

它提供了四个模块来解析不同类型的数据

在拥有原始内容之后,body-parser将使用上述策略之一(取决于您决定使用的中间件)来解析数据。您可以通过阅读他们的文档来了解更多有关他们的信息。

req.body设置为已解析的正文之后,body-parser将调用next()来调用堆栈中的下一个中间件,然后该中间件可以访问请求数据而无需考虑如何解压缩并解析它。

答案 9 :(得分:1)

保持简单: 如果您使用post,那么您将需要请求的body,因此您将需要bodyParser