问题来源
语言: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协议看起来吧~