我不明白为什么在Express应用程序中需要体解析器,因为我们可以不使用体解析器来获取数据。 它到底做什么,怎么做?


当前回答

让我们尽量减少技术性。

假设你正在发送一个html表单数据到node-js服务器,也就是说你向服务器发出了一个请求。服务器文件将在请求对象下接收您的请求。按照逻辑,如果你在服务器文件中记录这个请求对象你会看到表单数据,这些数据可以提取出来!实际上你没有!

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

简单的解释是,http以零碎的形式发送表单数据,以便在到达目的地时进行组装。那么如何提取数据呢?

但是,为什么每次都要手动解析数据块并将其组装起来呢?使用一种叫做“body-parser”的东西,它可以帮你做到这一点。

Body-parser解析您的请求并将其转换为可以轻松提取所需相关信息的格式。

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

如果使用体解析器,则从请求中提取用户名和密码如下所示。

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

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

其他回答

让我们尽量减少技术性。

假设你正在发送一个html表单数据到node-js服务器,也就是说你向服务器发出了一个请求。服务器文件将在请求对象下接收您的请求。按照逻辑,如果你在服务器文件中记录这个请求对象你会看到表单数据,这些数据可以提取出来!实际上你没有!

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

简单的解释是,http以零碎的形式发送表单数据,以便在到达目的地时进行组装。那么如何提取数据呢?

但是,为什么每次都要手动解析数据块并将其组装起来呢?使用一种叫做“body-parser”的东西,它可以帮你做到这一点。

Body-parser解析您的请求并将其转换为可以轻松提取所需相关信息的格式。

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

如果使用体解析器,则从请求中提取用户名和密码如下所示。

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

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

编辑:2019年4月2日 在express@4.16.0中,express中包含了体解析器中间件,因此您不再需要单独安装体解析器。更多细节请看这个

OLD:

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

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

中间件之前是Express.js的一部分,但现在你必须单独安装它。

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

npm install body-parser --save

为了访问post数据,我们必须使用body解析器。基本上body-parser就是允许express读取body然后解析成我们能理解的Json对象。

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

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

这里的答案解释得非常详细和精彩,答案包括:

In short; body-parser extracts the entire body portion of an incoming request stream and exposes it on req.body as something easier to interface with. You don't need it per se, because you could do all of that yourself. However, it will most likely do what you want and save you the trouble. To go a little more in depth; body-parser gives you a middleware which uses nodejs/zlib to unzip the incoming request data if it's zipped and stream-utils/raw-body to await the full, raw contents of the request body before "parsing it" (this means that if you weren't going to use the request body, you just wasted some time). After having the raw contents, body-parser will parse it using one of four strategies, depending on the specific middleware you decided to use: bodyParser.raw(): Doesn't actually parse the body, but just exposes the buffered up contents from before in a Buffer on req.body. bodyParser.text(): Reads the buffer as plain text and exposes the resulting string on req.body. bodyParser.urlencoded(): Parses the text as URL encoded data (which is how browsers tend to send form data from regular forms set to POST) and exposes the resulting object (containing the keys and values) on req.body. For comparison; in PHP all of this is automatically done and exposed in $_POST. bodyParser.json(): Parses the text as JSON and exposes the resulting object on req.body. Only after setting the req.body to the desirable contents will it call the next middleware in the stack, which can then access the request data without having to think about how to unzip and parse it.

你可以参考body-parser github来阅读他们的文档,它包含了关于其工作的信息。