我不明白为什么我们在Express应用程序中需要body-parser
,因为我们可以在不使用body-parser
的情况下获取数据。
它实际上做了什么以及如何做到了?
答案 0 :(得分:169)
要在 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
在2019年4月2日编辑 在express@4.16.0中,body-parser中间件捆绑了express。 for more details see this
答案 1 :(得分:43)
是的,我们可以在没有{path:'signup',component:VendorRegistrationComponent,resolve:{userdata:ServiceResolve}},
的情况下工作。当您不使用它时,您将获得原始请求,并且您的正文和标题不在请求参数的根对象中。您必须单独操作所有字段。
或者您可以使用body-parser
,因为快速团队正在维护它。
身体解析器可以为您做什么:它简化了请求 如何使用它:以下是示例:
安装body-parser
这个如何在express中使用body-parser:
npm install body-parser --save
链接。
答案 2 :(得分:39)
答案here解释得非常详细和出色,答案包含:
总之; body-parser 提取传入请求流的整个正文部分,并在
req.body
上公开它,以便更容易与之交互。你本身并不需要它,因为你可以自己完成所有这些。但是,它很可能会做你想要的并省去你的麻烦。进一步深入; body-parser为您提供了一个中间件,如果它是压缩的,则使用nodejs/zlib解压缩传入的请求数据,并在“解析”之前等待请求正文的完整原始内容stream-utils/raw-body(这意味着如果你不打算使用请求体,你只是浪费了一些时间。)
获取原始内容后,body-parser将使用四种策略之一解析它,具体取决于您决定使用的特定中间件:
bodyParser.raw():实际上并不解析正文,只是在
req.body
req.body
上公开之前缓存的内容。Buffer:以纯文本形式读取缓冲区,并在req.body上公开生成的字符串。
- 中公开
bodyParser.text():将文本解析为URL编码数据(这是浏览器倾向于将表单数据从常规表单发送到POST的方式)并在{上显示结果对象(包含键和值) {1}}。为了比较;在PHP中,所有这些都是自动完成的,并在
$_POST
。bodyParser.urlencoded():将文本解析为JSON,并在
req.body
上公开生成的对象。只有在将
req.body
设置为所需内容后,它才会调用堆栈中的下一个中间件,然后可以访问请求数据,而无需考虑如何解压缩和解析它。
您可以参考 body-parser bodyParser.json()来阅读他们的文档,其中包含有关其工作的信息。
答案 3 :(得分:25)
让我们尽量保持最低的技术水平。
假设您正在将HTML表单数据发送到node-js服务器,即您向服务器发出了请求。服务器文件将在请求对象下接收您的请求。现在按逻辑,如果您在服务器文件中控制台记录此请求对象,则应该在其中的某些位置看到表单数据,然后可以将其提取出来,但是哇!你实际上不!
那么,我们的数据在哪里?如果它不仅出现在我的请求中,我们将如何提取它。
对此的简单解释是http以分段形式发送表单数据,目的是在到达目的地时进行组装。那么您将如何提取数据。
但是,为什么要每次手动手动分析数据并将其组装起来却费心。使用一种叫做“ body-parser”的东西可以为您做到这一点。
body-parser解析您的请求并将其转换为一种格式,您可以从中轻松提取您可能需要的相关信息。
例如,假设您在前端有一个注册表格。您正在填充它,并请求服务器将详细信息保存在某处。
如果使用body-parser,从请求中提取用户名和密码非常简单。
var loginDetails = {
username : request.body.username,
password : request.body.password
};
因此,基本上,body解析器解析您的传入请求,组装包含表单数据的块,然后为您创建此body对象并用表单数据填充它。
答案 4 :(得分:9)
它解析HTTP请求正文。当您需要了解的不仅仅是您点击的URL时,这通常是必需的,特别是在POST或PUT PATCH HTTP请求的上下文中,您需要的信息包含在正文中。
基本上它是一个中间件,用于解析JSON,纯文本或只是返回一个原始的Buffer对象供您根据需要处理。
答案 5 :(得分:7)
为了访问帖子数据,我们必须使用1
。基本上body-parser
允许表达读取正文然后将其解析为我们可以理解的body-parser
对象。
答案 6 :(得分:7)
这些都是为了方便起见。
基本上,如果问题是“我们需要使用body-parser
吗?”答案是不'。我们可以使用更加迂回的路径从客户端发布请求中获取相同的信息,这些路径通常不太灵活,并且会增加我们必须编写的代码量以获取相同的信息。
这与询问'我们需要使用express
开头吗?同样,答案是否定的,而且,真的一切都归结为拯救我们编写更多代码以执行“内置”所表达的基本事物的麻烦。
从表面上看 - body-parser
可以更方便地以各种格式获取客户端请求中包含的信息,而不是让您捕获原始数据流并确定信息的格式,更不用说手动将该信息解析为可用数据。
答案 7 :(得分:3)
如果您不想使用单独的npm包body-parser,最新的express(4.16+)具有内置的body-parser中间件,可以像这样使用,
const app = express();
app.use(express.json({ limit: '100mb' }));
p.s。并不是所有的正文解析功能都存在于Express中。有关完整用法,请参阅文档here
答案 8 :(得分:2)
了解请求正文
接收到POST或PUT请求时,请求正文可能是 对您的应用很重要。获取身体数据有点 比访问请求标头更复杂。请求对象 传递给处理程序的实现了ReadableStream接口。 就像在其他地方一样,可以在其他地方收听或传送此流 流。我们可以通过收听以下内容直接从流中获取数据 流的“数据”和“结束”事件。
每个“数据”事件中发出的块是一个缓冲区。如果你知道 将是字符串数据,最好的办法是收集数据 数组,然后在“末尾”将其连接并字符串化。
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 });
了解人体分析器
根据其文档
在处理程序之前解析中间件中的传入请求正文, 在req.body属性下可用。
正如您在第一个示例中看到的那样,我们必须手动解析传入的请求流以提取主体。当存在不同类型的多种表单数据时,这变得有些繁琐。因此,我们使用body-parser软件包在后台执行所有任务。
它提供了四个模块来解析不同类型的数据
在拥有原始内容之后,body-parser将使用上述策略之一(取决于您决定使用的中间件)来解析数据。您可以通过阅读他们的文档来了解更多有关他们的信息。
将req.body
设置为已解析的正文之后,body-parser将调用next()
来调用堆栈中的下一个中间件,然后该中间件可以访问请求数据而无需考虑如何解压缩并解析它。
答案 9 :(得分:1)
保持简单:
如果您使用post
,那么您将需要请求的body
,因此您将需要bodyParser
。