如何让Express将自定义Content-Type识别为JSON格式
让Express处理自定义Content-Type的JSON数据
当然可以,Express提供了灵活的方式来处理这类自定义Content-Type的JSON请求,下面给出两种常用方案:
方案1:修改内置express.json()的类型匹配规则
Express内置的express.json()中间件默认只解析application/json类型的请求体,但你可以通过type参数扩展它的匹配范围,支持字符串通配符、正则表达式或者自定义判断函数。
针对你提到的application/xxx.yyy.zzz.formname.v1+json这类以+json结尾的Content-Type,最简单的方式是使用通配符匹配:
const express = require('express'); const app = express(); // 匹配所有application/开头且以+json结尾的Content-Type app.use(express.json({ type: 'application/*+json' })); // 测试接口 app.post('/submit-form', (req, res) => { console.log('解析后的JSON数据:', req.body); res.status(200).json({ success: true, receivedData: req.body }); });
如果需要更精确的匹配(比如限定表单名称或版本格式),可以用正则表达式:
app.use(express.json({ type: /^application\/[a-z0-9.]+\.formname\.v\d+\+json$/i }));
这个正则会匹配类似application/xxx.yyy.zzz.formname.v1+json、application/abc.formname.v2+json这类格式的Content-Type。
方案2:自定义解析中间件
如果需要更灵活的逻辑(比如根据不同的Content-Type分支处理),可以自己编写中间件手动判断并解析:
const express = require('express'); const bodyParser = require('body-parser'); const app = express(); app.use((req, res, next) => { const contentType = req.headers['content-type']; // 判断Content-Type是否符合你的自定义JSON格式 if (contentType?.endsWith('+json')) { // 使用bodyParser.json()解析请求体 bodyParser.json()(req, res, next); } else { // 不符合则跳过,交给后续中间件处理 next(); } }); // 错误处理:捕获JSON解析失败的情况 app.use((err, req, res, next) => { if (err instanceof SyntaxError && err.status === 400 && 'body' in err) { return res.status(400).json({ error: '请求体不是合法的JSON格式' }); } next(err); }); // 测试接口 app.post('/submit-form', (req, res) => { res.status(200).json({ success: true, data: req.body }); });
注意事项
- 无论用哪种方案,都要确保请求体本身是合法的JSON格式,否则会触发解析错误,建议添加错误处理中间件捕获这类异常。
- 如果你的自定义Content-Type有多种变体,优先用通配符或正则匹配,避免逐个枚举类型。
内容的提问来源于stack exchange,提问作者Ron Jonk
相关产品推荐
相关产品推荐

