带有自定义标头的 Express 正文解析器
Posted
技术标签:
【中文标题】带有自定义标头的 Express 正文解析器【英文标题】:Express Body Parser with Custom Header 【发布时间】:2017-04-11 13:58:27 【问题描述】:我正在设置一个 REST API,它接受具有自定义 Content-Type 的请求,但是我在使用 NPM 包 body-parser 解析正文时遇到了问题。我正在使用 Mocha 和 Chai-HTTP 运行一些测试,并像这样设置我的请求测试:
chai.request(server)
.post('/demo')
.set('Content-Type', 'application/vnd+companyName.v01+json')
.send(name: 'test')
.end(function(err, res) /* tests are here */);
在我的 express 应用的 app.js 中,我调用了这个中间件:
app.use(bodyParser.json(type: 'application/*+json'));
当我使类型更通用时,比如将其设置为“application/*”,我可以使用“application/json”内容类型传递请求,但不是我的自定义类型。当我这样做时,我的 req.body 是一个空对象。如果 bodyParser 完全不起作用,则 req.body 将是未定义的,而不是空对象。通过查看文档,我觉得我对 bodyParser 调用的选项是正确的,但显然不是 - 任何见解?
【问题讨论】:
您并没有描述 “无法解析正文”的意思。 对不起。我的意思是,一旦我通过中间件并到达我的路由,req.body 就是一个空对象。 嗯,是的,我可以重现这个问题。让我检查一下…… 谢谢,如果您需要更多信息,请告诉我。 【参考方案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
配置部分,允许客户端在其请求中使用大写。
【讨论】:
有趣,感谢您的提醒。这解决了我的问题。 您在哪里看到type-is 需要小写子类型?我挖掘了源头,但它并没有立即出现在我身上。我将在body-parser 的文档上打开一个拉取请求以澄清这一点。 哦,这只是通过实验发现的。当服务器配置大写字符时它不匹配,但是当我将它们小写时它匹配。以上是关于带有自定义标头的 Express 正文解析器的主要内容,如果未能解决你的问题,请参考以下文章
HttpClient postasync,带有自定义标头和应用程序/json,用于正文 C#
TypeScript 在 Express 中添加自定义请求标头
具有自定义标头和请求正文作为 JSON 字符串的跨域 jquery ajax 请求
如何使用 CakePHP 3.4 输出自定义 HTTP 正文内容?回显导致“无法发出标头”错误