Node.js 体解析器对express做什么?

Node.js 体解析器对express做什么?,node.js,express,body-parser,Node.js,Express,Body Parser,我不明白为什么在Express应用程序中需要body parser,因为我们不需要使用body parser就可以获取数据。 它实际上做什么以及如何做?要处理Express.js版本4及更高版本中的httppost请求,您需要安装名为body parser的中间件模块 body解析器提取传入请求流的整个body部分,并在req.body 该中间件以前是Express.js的一部分,但现在必须单独安装 此正文解析器模块解析使用httppost请求提交的JSON、缓冲区、字符串和URL编码数据。使用

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

要处理Express.js版本4及更高版本中的
httppost
请求,您需要安装名为
body parser
的中间件模块

body解析器
提取传入请求流的整个body部分,并在
req.body

该中间件以前是Express.js的一部分,但现在必须单独安装

正文解析器
模块解析使用
httppost
请求提交的JSON、缓冲区、字符串和URL编码数据。使用NPM安装
主体解析器
,如下所示

npm install body-parser --save
2019年4月-2日编辑:
在里面express@4.16.0主体解析器中间件与express捆绑在一起

为了访问post数据,我们必须使用
主体解析器
。基本上,
body解析器是什么,它允许express读取body,然后将其解析为我们可以理解的
Json
对象。

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


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

这些都是为了方便起见

基本上,如果问题是“我们需要使用
主体解析器吗?”,答案是“不”。我们可以使用更迂回的路径从客户机post请求中获得相同的信息,这种路径通常不太灵活,并且会增加我们为获得相同信息而必须编写的代码量

这与问“我们是否需要使用
express
作为开始?”是一样的。同样,答案是否定的,而且,实际上,这一切都可以归结为省去我们编写更多代码的麻烦,以完成express随“内置”而来的基本功能

从表面上看,
body parser
使以各种格式获取客户端请求中包含的信息变得更容易,而不是让您捕获原始数据流并找出信息的格式,更不用说手动将这些信息解析为可用数据了。

答案非常详细和精辟,答案包括:

简言之;正文解析器提取传入请求流的整个正文部分,并在
req.body
上将其公开为更易于接口的内容。你不需要它本身,因为你可以自己做所有这些。然而,它很可能会做你想做的事,并为你省去麻烦


更深入一点;body parser为您提供了一个中间件,该中间件用于解压传入的请求数据(如果已压缩),并在“解析”之前等待请求正文的完整原始内容(这意味着如果您不打算使用请求正文,您只会浪费一些时间)

获得原始内容后,主体解析器将使用四种策略之一对其进行解析,具体取决于您决定使用的特定中间件:

  • :不实际解析正文,只是在on
    req.body
    中公开以前缓冲的内容

  • :将缓冲区读取为纯文本,并在req.body上显示结果字符串

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

  • :将文本解析为JSON,并在
    req.body
    上公开结果对象

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


您可以参考body parser阅读他们的文档,其中包含有关其工作的信息。

是的,我们可以在没有
body parser的情况下工作。当您不使用它时,您将获得原始请求,并且您的主体和头不在请求参数的根对象中。您必须单独操作所有字段

或者,您可以使用
主体解析器
,因为express团队正在维护它

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

安装
npm安装正文解析器--保存

下面介绍如何在express中使用主体解析器:

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

然后,您可以在根请求对象中获取主体和头。范例

app.post("/posturl",function(req,res,next){
    console.log(req.body);
    res.send("response");
})

让我们尽量保持这一最低的技术性

假设您正在向NodeJS服务器发送html表单数据,即您向服务器发出了请求。服务器文件将在请求对象下接收您的请求。现在,按照逻辑,如果您将这个请求对象记录在服务器文件中,您应该可以在其中的某个位置看到表单数据,然后可以提取这些数据,但是哇!你真的不知道

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

对此的简单解释是http以位和块的形式发送表单数据,这些数据在到达目的地时被组装起来。那么,您将如何提取数据呢

但是,为什么每次手动解析数据块并将其组装时都要承受这种痛苦呢。使用一种称为“主体解析器”的方法,它可以为您实现这一点

正文解析器解析您的请求,并将其转换为一种格式,您可以轻松地从中提取相关内容
var loginDetails = {    
    username : request.body.username,    
    password : request.body.password    
};
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
});
const app = express();
app.use(express.json({ limit: '100mb' }));
{ extended: false }