nodejs+express项目针对特定的请求使用不同的body-parser处理。node+express项目全局使用bodyParser.json()和bodyParser.urlencoded()。但是现在有一个要求,对于某些前缀的URL请求,需要获取Buffer格式的请求体,而不是JSON格式。官方的body-parser文档描述了如何针对不同的请求使用不同的解析器:=bodyParser.json()//创建application/x-www-form-urlencodedparservarurlencodedParser=bodyParser.urlencoded({extended:false})//POST/login获取urlencodedbodiesapp.post('/login',urlencodedParser,function(req,res){res.send('welcome,'+req.body.username)})//POST/api/users获取JSONbodiesapp.post('/api/users',jsonParser,function(req,res){//createuserinreq.body})但是项目中使用的是expressroute,没办法直接重写具体的route。看到一篇文章,verify(req,res,buf的第三个参数,encoding)函数可以获取到rawbody,但是文中也提到了缺点,对所有请求都生效。配置项中还有一个type函数。官方文档说:typetype选项用来决定中间件解析什么媒体类型。此选项可以是字符串、字符串数组或函数。如果不是函数,type选项直接传递给type-is库,这可以是扩展名称(如bin)、mime类型(如application/octet-stream)或带通配符的mime类型(如*/*或应用程序/*)。如果是一个函数,则类型选项被称为fn(req)并且如果它返回一个真值则解析请求。默认为application/octet-stream。当参数为非函数时,可以是mime类型(类似application/octet-stream),可以设置解析哪种类型的数据。如果是函数,req会作为参数,返回真值的request会被解析。所以可以在这个函数中判断req.url是否匹配到特定的前缀,如果匹配则使用bodyParser.raw解析代码:index.jsconstexpress=require('express')constapp=express()constrouters=require('./router/index')constdeviceRouters=require('./router/device/index')constbodyParser=require('body-parser')//以'/device/web/'开头的URL使用bodyParser.raw以格式获取缓冲区数据app.use(bodyParser.raw({type(req){return/^\/device\/web\/.*/.test(req.url)}}))app.使用(bodyParser.json({limit:'256mb',扩展:true}))app.use(bodyParser.urlencoded())app.use(路由器)app.use(deviceRouters)app.listen(3000,()=>{})router/index.jsconstexpress=require('express')constrouter=express.Router()//路由router.post('/',()=>{})module.exports=router
