Express框架中解析多种MIME类型请求体的规范实现方法
Express 多MIME类型请求体解析方案
核心结论
不需要从零编写自定义body parser,基于Express内置中间件配合对应格式的解析库即可实现需求;Express内置的json中间件仅会处理匹配application/json的请求,不会消费其他MIME类型的请求流,非JSON类型的原始请求体可以正常获取。
具体实现步骤
- 首先安装YAML解析依赖
npm install js-yaml
- 调整Express中间件配置,新增YAML解析逻辑
const express = require('express') const yaml = require('js-yaml') const app = express() // 保留原有JSON解析能力,仅处理application/json类型请求 // 若需要留存JSON请求的原始体,可开启verify配置 app.use(express.json({ // verify: (req, res, buf) => req.rawBody = buf })) // 针对application/yaml类型的请求,先读取原始文本内容 app.use(express.text({ type: 'application/yaml' })) // 解析YAML文本为对象 app.use((req, res, next) => { if (req.get('content-type') !== 'application/yaml') return next() try { req.body = yaml.load(req.body) next() } catch (err) { return res.status(400).json({ error: 'YAML格式不合法' }) } }) app.post('/test', (req, res) => { res.status(200).json(req.body) }) app.listen(3000)
实现说明
- Express内置的
express.json()中间件默认仅对Content-Type为application/json的请求做流读取和解析,其他类型的请求会直接跳过,不会占用原始请求流,因此YAML类型的请求可以正常读取原始内容 - 上述实现同时兼容你提到的两类请求:
application/json类型会走原有JSON解析逻辑,application/yaml类型会走自定义YAML解析逻辑,路由侧无需做额外判断即可直接使用req.body - 如果需要适配更多MIME类型(比如XML、CSV等),都可以按照相同逻辑,配合对应格式的解析库快速实现,不需要从零处理流读取、编码兼容等底层逻辑
内容的提问来源于stack exchange,提问作者Balázs Édes
相关产品推荐
相关产品推荐

