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

jit*_*ten 289 node.js express body-parser

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

Mal*_*til 211

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

body-parser提取传入请求流的整个正文部分并将其公开req.body.

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

body-parser模块解析使用HTTP POST请求提交的JSON,缓冲区,字符串和URL编码数据.body-parser使用NPM 安装,如下所示.

npm install body-parser --save
Run Code Online (Sandbox Code Playgroud)

  • 这很可能是有史以来最蹩脚的事情.为什么Express核心开发人员会让新手加入到为Web开发中最常见的用例安装额外的中间件时难以接受? (96认同)
  • @fnaquira - 你很困惑.这是关于表达不是节点. (25认同)
  • @elmt如果你想要有意见的东西,试试sails.js (5认同)
  • 它不是蹩脚的@elmt,节点不仅适用于网络,它可以用于桌面,移动等,在这些情况下它不是必需的模块.Node可以适应您的应用程序,不承担任何责任 (3认同)
  • @ user1063287 是的,确实如此。`urlencoded()` 和 `json()` 实际上是中间件工厂,它们返回调用 `next()` 的中间件函数 (2认同)
  • 也许 Express 不适合新手?<鸭子> (2认同)
  • @elmt 实际上这也是其他框架发生的事情,例如 react native!这是有充分理由的。我们应该尽量减轻核心框架。这样,需要特定功能的人可以轻松地将其添加到项目中,不需要的人可以拥有其应用程序的最轻版本 (2认同)
  • @elmt Express 版本 4.16+ 在默认 Express 包中包含自己的 body-parser 实现,因此您无需下载其他依赖项。 (2认同)

Him*_*rma 64

是的,我们可以不用body-parser.执行此操作时,您将获得原始请求,并且您的正文和标题不在根对象中.您将不得不单独操纵所有字段.

或者你可以使用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 }));
Run Code Online (Sandbox Code Playgroud)

链接.

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

  • 嘿,谢谢您的信息,您可以发布一个没有正文解析器的代码示例吗? (4认同)

Sur*_*ain 51

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

简而言之; 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所需内容后,它才会调用堆栈中的下一个中间件,然后可以访问请求数据,而无需考虑如何解压缩和解析它.

您可以参考body-parser github来阅读他们的文档,它包含有关其工作的信息.


小智 36

让我们试着保持最低技术性.

假设您正在向node-js服务器发送html表单数据,即您向服务器发出了请求.服务器文件将在请求对象下接收您的请求.现在通过逻辑,如果你控制台在服务器文件中记录这个请求对象,你应该看到你的表单数据在哪里,然后可以提取,但是谁!你实际上没有!

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

对此的简单解释是,http发送您的表单数据,这些数据旨在在到达目的地时进行组合.那么你将如何提取数据?

但是,为什么每次都要手动解析数据并将其组装起来.使用一种叫做"身体解析器"的东西来为你做这件事.

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

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

如果您使用正文解析器,从您的请求中提取用户名和密码就像下面一样简单.

var loginDetails = {    
    username : request.body.username,    
    password : request.body.password    
};
Run Code Online (Sandbox Code Playgroud)

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


May*_*yur 16

历史:

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

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

有兴趣的人可以在这里查看 4.16.0 的发布历史记录,也可以在这里获取拉取请求。

好了,回到正题,

执行:

您只需添加即可,

app.use(express.json());
app.use(express.urlencoded({ extended: true}));
Run Code Online (Sandbox Code Playgroud)

在路线声明之前,而不是,

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
Run Code Online (Sandbox Code Playgroud)

Express 将满足您的要求。:)

完整的例子看起来像,

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")
})
Run Code Online (Sandbox Code Playgroud)


Dee*_*dar 9

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

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


Him*_*nsh 9

了解请求正文

接收 POST 或 PUT 请求时,请求正文可能对您的应用程序很重要。获取正文数据比访问请求标头要复杂一些。传入处理程序的请求对象实现了 ReadableStream 接口。可以像任何其他流一样在其他地方收听或通过管道传输此流。我们可以通过监听流的 'data' 和 'end' 事件直接从流中获取数据。

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

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
});
Run Code Online (Sandbox Code Playgroud)

理解身体解析器

根据其文档

在处理程序之前在中间件中解析传入的请求正文,在 req.body 属性下可用。

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

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

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

设置req.body为解析后的 body 后,body-parser 会调用next()栈向下调用下一个中间件,这样就可以访问请求数据,而无需考虑如何解压和解析。


Ana*_*iva 9

如果你不想使用单独的 npm 包 body-parser,latest express (4.16+) 内置了 body-parser 中间件,可以这样使用,

const app = express();
app.use(express.json({ limit: '100mb' }));
Run Code Online (Sandbox Code Playgroud)

ps 并非身体解析的所有功能都存在于快递中。请在此处参阅文档以了解完整用法


小智 7

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


Ric*_*den 7

这些都是方便的问题.

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

这是一种同为询问"我们需要使用express到开始?再一次,答案是否定的,真的,这一切都归结为拯救我们编写更多代码以执行"内置"所表达的基本事物的麻烦.

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


Hos*_*ury 6

把事情简单化 :

  • 如果您使用了post请求,那么您将需要body请求的 ,因此您将需要body-parser
  • 不需要安装body -parserexpress,但use如果你会收到 post 请求,你必须安装它。

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

{ extended: false }
Run Code Online (Sandbox Code Playgroud)

false 的意思是,您的body对象中没有嵌套数据。需要注意的是:请求数据作为主体对象嵌入到请求中。