express解析的req.body为{}

问题来源

语言:nodejs
框架:express
需求:对接视频结构化设备(此服务会推送捕捉到的人像或者车辆等信息)
开发:使用express快速搭建一个新项目
问题:对接时,视频结构化设备推送的信息,打印出来的req.body是{}空对象。但是我使用postman调用的时候,是可以打印出来body对象的。
实现:以下我将按照我的思路来重构一下问题和找问题的思路。

开发

使用express快速搭建新项目

1.npm i express -g
2.npm i express-generater -g
3.express -e 项目名

此时已经快速搭建出来了项目。

开发步骤

1.在视频结构化设备系统中,配置推送的路径(你可以不关心)
2.打印出req.body(post请求 路径为/ )

router.post('/', function(req, res, next) {
  console.log('req.body',req.body);
  res.send('sssss');
});

3.结果 为什么打印出来的是{}空对象呢???
在这里插入图片描述
4.排查问题
(1)使用postman发送试试,是不是代码没有将body解析呢?
在这里插入图片描述
最终发现,好像代码并没有什么问题
(2)那是他们发送的数据本身就是空的??—问了开发这个人,说是有推送了呢?那问题在哪呢?
使用网络调试助手来抓取数据
在这里插入图片描述
其图如下:在工具右侧"网络数据接受"处是可以看到抓取到数据的,那只能从代码入手查问题了。但是懂http协议的人就发现,他们推送的数据头部只有POST HTTP/1.1 HOST Content-Length并木有发现Content-Type字段,其实此请求是不怎么符合协议的。

那么问题其实就是出现在这里,此请求的信息是不符合基本的http协议的要求的,express框架也就未对其进行解析,所以,其req.body就是{}空对象。

5.修改代码
经过查看express解析数据的源代码来看,当没有Content-Type的时候,此请求未正常解析,那么我们怎么修改呢?
直接粘贴代码:增加了一个设置类型的方法,在解析之前进行拦截

router.post('/',function setType(req,res,next){
  req.headers['content-type']="application/json";
  next();
},express.json(), function(req, res, next) {
  console.log('req.body',req.body);
});

结果如下:
在这里插入图片描述

tips: 复现

如果你没有这样的接口回调,怎么来测试呢?
使用postman发送的时候,将其headers里的Content-Type去掉发送试一下就知道这个的重要性了~~~
查漏补缺:发现http协议知识还是挺重要的,不然怎么下手来改这样的bug呢,将http协议看起来吧~

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值