我不明白为什么在Express应用程序中需要体解析器,因为我们可以不使用体解析器来获取数据。 它到底做什么,怎么做?
当前回答
是的,我们可以在没有体解析器的情况下工作。当你不使用它时,你得到原始请求,你的主体和头不在request参数的根对象中。您必须单独操作所有字段。
或者您可以使用body解析器,因为express团队正在维护它。
body-parser能为您做什么:它简化了请求。 如何使用:下面是例子:
安装body-parser
这是如何在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");
});
其他回答
编辑: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
这些都是为了方便起见。
基本上,如果问题是“我们需要使用体解析器吗?”答案是否定的。我们可以使用更迂回的路线从请求后的客户端获得相同的信息,这种路线通常不太灵活,并且会增加我们必须编写的代码数量来获得相同的信息。
这有点像问“我们一开始需要用express吗?”同样,答案是否定的,同样,这一切都归结为为我们省去了编写更多代码来完成“内置”表达的基本事情的麻烦。
从表面上看,体解析器使以各种格式获取客户端请求中包含的信息变得更容易,而不是让您捕获原始数据流并确定信息的格式,更不用说手动将信息解析为可用的数据了。
理解请求正文
When receiving a POST or PUT request, the request body might be important to your application. Getting at the body data is a little more involved than accessing request headers. The request object that's passed in to a handler implements the ReadableStream interface. This stream can be listened to or piped elsewhere just like any other stream. We can grab the data right out of the stream by listening to the stream's 'data' and 'end' events. The chunk emitted in each 'data' event is a Buffer. If you know it's going to be string data, the best thing to do is collect the data in an array, then at the 'end', concatenate and stringify it. 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 });
理解分析体
根据其文件
在处理程序之前解析中间件中的传入请求体, 可根据要求提供。身体属性。
正如您在第一个示例中看到的,我们必须手动解析传入的请求流以提取正文。当有多个不同类型的表单数据时,这就变得有点乏味了。因此,我们使用主体解析器包,它在底层完成所有这些任务。
它提供了四个模块来解析不同类型的数据
JSON正文解析器 原始体解析器 文本正文解析器 url编码的表单正文解析器
在获得原始内容体之后,解析器将使用上述策略之一(取决于您决定使用的中间件)来解析数据。您可以通过阅读它们的文档来了解更多有关它们的信息。
在设置需求之后。Body到已解析的Body, Body解析器将调用next()来调用堆栈中的下一个中间件,然后中间件就可以访问请求数据,而不必考虑如何解压缩和解析它。
历史:
早期版本的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")
})
让我们尽量减少技术性。
假设你正在发送一个html表单数据到node-js服务器,也就是说你向服务器发出了一个请求。服务器文件将在请求对象下接收您的请求。按照逻辑,如果你在服务器文件中记录这个请求对象你会看到表单数据,这些数据可以提取出来!实际上你没有!
那么,我们的数据在哪里?如果它不仅出现在我的请求中,我们将如何提取它。
简单的解释是,http以零碎的形式发送表单数据,以便在到达目的地时进行组装。那么如何提取数据呢?
但是,为什么每次都要手动解析数据块并将其组装起来呢?使用一种叫做“body-parser”的东西,它可以帮你做到这一点。
Body-parser解析您的请求并将其转换为可以轻松提取所需相关信息的格式。
例如,假设在前端有一个注册表单。您正在填写它,并请求服务器将详细信息保存在某个地方。
如果使用体解析器,则从请求中提取用户名和密码如下所示。
var loginDetails = {
username : request.body.username,
password : request.body.password
};
基本上,body-parser解析传入的请求,组装包含表单数据的块,然后为您创建这个body对象,并用表单数据填充它。
推荐文章
- DeprecationWarning:当我将脚本移动到另一个服务器时,由于安全性和可用性问题,Buffer()已弃用
- 我如何确定正确的“max-old-space-size”为Node.js?
- npm犯错!代码UNABLE_TO_GET_ISSUER_CERT_LOCALLY
- Access-Control-Allow-Origin不允许Origin < Origin >
- 如何获得所有已注册的快捷路线?
- 你可以为你的组织托管一个私有的存储库来使用npm吗?
- 如何定位父文件夹?
- Gulp命令未找到-安装Gulp后错误
- 在Node.js中写入文件时创建目录
- 如何将自定义脚本添加到包中。Json文件,运行javascript文件?
- 使用child_process。execSync但保持输出在控制台
- SyntaxError:在严格模式下使用const
- 在Node.js中递归复制文件夹
- 如何在node.js中设置默认时区?
- “react-scripts”不被视为内部或外部命令