体解析器使用express做什么?

我不明白为什么在Express应用程序中需要body-parser,因为我们可以不使用body-parser获得数据。 它到底做什么,怎么做?< / p >
409190 次浏览

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

旧:

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

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

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

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

这些都是为了方便起见。

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

这有点类似于问“我们是否从需要开始使用express ?”同样,答案是否定的,同样,这一切都归结为为我们省去了编写更多代码来完成“内置”表达的基本事情的麻烦。

从表面上看,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设置为所需的内容之后,它才会调用堆栈中的下一个中间件,然后该中间件就可以访问请求数据,而不必考虑如何解压缩和解析它。

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

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

或者你也可以使用body-parser,因为express团队正在维护它。

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

链接。

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

然后你可以在根请求对象中得到body和header。例子

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

让我们尽量减少技术性。

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

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

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

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

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

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

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

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

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

理解请求正文

当接收一个POST或PUT请求时,请求体可能是 对您的应用程序很重要。获取尸体数据有点 比访问请求头更复杂。请求对象 传递给处理程序实现ReadableStream接口。 这个流可以像其他流一样在其他地方收听或传输 流。我们可以通过监听直接从流中获取数据 流的'data'和'end'事件 在每个'data'事件中发出的块是一个Buffer。如果你知道它是 字符串数据,最好的方法是收集数据 一个数组,然后在'end'处连接并stringify它

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

理解分析体

根据其文件

在处理程序之前解析中间件中的传入请求体, 可根据要求提供。身体属性。< / p >

正如您在第一个示例中看到的,我们必须手动解析传入的请求流以提取正文。当有多个不同类型的表单数据时,这就变得有点乏味了。因此,我们使用主体解析器包,它在底层完成所有这些任务。

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

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

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

如果你不想使用单独的npm包体解析器,最新的express(4.16+)有内置的体解析器中间件,可以这样使用:

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

附:并不是所有的体解析功能都在表达式中。详细使用在这里请参考文档

保持简单:

  • 如果你使用了post请求,那么你将需要请求的body,所以你 将需要body-parser.
  • 不需要用express安装分析体,但如果你愿意,你必须use
  • .接收post请求

app.use(bodyParser.urlencoded({ extended: false }));

{ extended: false }

的意思是,在你的身体对象中没有嵌套数据。注意:请求数据内嵌在请求体对象中。

历史:

早期版本的Express曾经捆绑了许多中间件。bodyParser是附带的中间件之一。当Express 4.0发布时,他们决定从Express中移除捆绑的中间件,并将它们作为单独的包。在安装了bodyParser模块之后,语法从app.use(express.json())变成了app.use(bodyParser.json())

bodyParser在4.16.0版本中被添加回Express,因为人们希望它像以前一样与Express捆绑。这意味着如果你使用的是最新版本,你就不必再使用bodyParser.json()了。你可以使用express.json()代替。

4.16.0的发布历史是在这里,而拉请求是在这里

好吧,言归正传,

实现:

你需要加的就是加,

app.use(express.json());
app.use(express.urlencoded({ extended: true}));

在路由声明之前,

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

快递公司会处理您的要求。:)

完整的例子是这样的,

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