带有自定义标头的 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 正文内容?回显导致“无法发出标头”错误

Xamarin Forms Shell 如何使用自定义渲染器自定义选项卡

Google 跟踪代码管理器自定义变量返回未定义