2017-04-11 61 views
1

我正在设置一个REST API,它采用自定义Content-Type请求,但我在使用NPM包体解析器解析正文时遇到问题。我运行一些测试与摩卡和柴HTTP和seding我的要求的测试是这样的:快速解析器与自定义标头

chai.request(server) 
.post('/demo') 
.set('Content-Type', 'application/vnd+companyName.v01+json') 
.send({name: 'test'}) 
.end(function(err, res) {/* tests are here */}); 

在我的快递应用程序的app.js,我调用这个中间件:

app.use(bodyParser.json({type: 'application/*+json'})); 

当我做类型更一般,比如使它成为'application/*',我可以通过'application/json'Content-Type传递请求,但不是我自定义的。当我这样做时,我的req.body是一个空的对象。如果bodyParser完全不工作,req.body将会是未定义的,而不是一个空对象。通过查看文档,我觉得我的bodyParser调用的选项是正确的,但显然不是 - 任何见解?

+0

你没有描述你的意思_“解析身体的麻烦”_。 – robertklep

+0

对不起。我的意思是,一旦我通过我的中间件和我的路线,req.body是一个空对象。 – loganhuskins

+0

嗯是的我可以重现这个问题。让我检查... – robertklep

回答

1

vnd+companyName.v01+json不是有效的媒体类型。

有效的媒体类型应该是这样的:

[ tree. ] subtype name [ +suffix ] [ ; parameters ] 

亚型名不能包含.+字符,这些被保留的(可选)后缀,分别为(RFC6838 )。

所以你的情况,MIME类型应该是这样的:

application/vnd.companyName-v01+json 

然而,似乎有通过body-parser征收的附加要求(或者更确切地说,type-is,这是用来匹配的内容类型) ,在该子类型名称需要小写:

application/vnd.companyname-v01+json 

奇怪的是,该要求仅适用于body-parser配置部分,客户端被允许在其请求使用大写。

+0

有趣的是,谢谢你的抬头。这解决了我的问题。 – loganhuskins

+0

你在哪里看到[type-is](https://www.npmjs.com/package/type-is)需要小写子类型?我从源头挖掘出来,它并没有立即弹出。我打算为[body-parser](https://github.com/expressjs/body-parser)的文档打开pull请求来澄清这一点。 – loganhuskins

+1

哦,那只是通过实验发现的。当服务器配置为大写字符时它不匹配,但是当我降低这些字符时它匹配。 – robertklep