You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 06:05:15