引出
最近写了个网站,然后放到服务器上之后没两天就开始时不时的抛出异常Error: bad content-type header, no content-type和unknow content-type: text/html,异常抛出后没有接收服务器就停止运行,即使我做了异常处理,但该异常依然会每天时不时的出现,甚至错误日志都被其刷屏。。
原因
被该异常搞得苦不堪言之后终于下定决心解决它,然而疯狂百度之后依旧一无所获,只能硬看代码硬改bug了
首先正常的浏览器客户端发送的请求都会有content-type,即使不显示添加浏览器也会根据内容为其添加,所以no content-type八成就是爬虫了,然后我输出res的请求头果然是百度爬虫。。。
即使客户端没有请求头属性content-type也不至于导致服务器抛出异常呀,以前写的网站也没有出现过这样的问题。。。
然后我用测试工具:Postman,逐个路由测试终于发现了问题:express-formidable模块
express-formidable模块是用于处理post请求的,当请求没有content-type属性或者content-type属性不是post请求指定类型时就会抛出Error: bad content-type header, no content-type和unknow content-type: text/html异常
解决方法
目前为止我也没有找到比较好的解决方法,我这里经常抛出该异常是因为我在根目录中引入了express-formidable模块处理请求,所以导致了只要有没带content-type属性的爬虫访问就会抛出异常
我的办法是将需要使用express-formidable模块的功能单独写一个路由,不要将其放置到根目录路由中,但是这样爬虫爬取单独写好的路由时还是会抛出no content-type,所以在该路由中再添加一个顶层中间键,判断一下是否有content-type属性,没有就手动为其添加(添加时要添加post请求的类型如application/x-www-form-urlencoded等否则会抛出unknow content-type: text/html)