javascript - 带有自定义 header 的 Express Body 解析器

标签 javascript node.js express body-parser

我正在设置一个 REST API,该 API 接受带有自定义内容类型的请求,但我在使用 NPM 包主体解析器解析主体时遇到问题。我正在使用 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 调用选项是正确的,但显然不是 - 有什么见解吗?

最佳答案

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 配置部分,允许客户端在其请求中使用大写字母。

关于javascript - 带有自定义 header 的 Express Body 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43348117/

相关文章:

php - 我可以用 javascript 循环 php SELECT 名称吗

javascript - 当我调用 d3.behavior.zoom 时,我的图形 range.domain() 变为空

javascript - 如何检查脚本是否在 Node.js 下运行?

jquery - 使用 jQuery - JSONP 从 Vagrant VM 上托管的第三方 Node.js 服务器获取数据

node.js - 如何在本地计算机 Windows XP 中使用 Node.js

node.js - 无法在 Ubuntu 中使用 Express.js

Node.js 快速连接被/拒绝

javascript - 语义 UI - 如何在模态窗口中使用粘性?

javascript - 通过脚本标签加载 JSON 文件

javascript - 在 NodeJS 中从服务器下载文件