express - 解析多种请求体的惯用方式(express)
问题描述
我正在尝试找到解析多个(一些非 json)mime 类型的请求正文的最佳方法。
假设我有一个像这样的简单应用程序:
const app = express()
app.use(express.json())
app.post('/test', (req, res) => {
res.status(200).json(req.body)
})
我将如何处理这两个请求并获得正确的请求正文?
fetch('/test', {
method: 'POST',
body: YAML.stringify({ foo: 'bar' }),
headers: {
'content-type': 'application/yaml',
},
})
fetch('/test', {
method: 'POST',
body: JSON.stringify({ foo: 'bar' }),
headers: {
'content-type': 'application/json',
},
})
我需要从头开始编写正文解析器吗?我什至可以这样做,因为在 json bodyparser 运行后 express 似乎没有暴露原始主体?
解决方案
我没有搜索支持 YAML 的正文解析器。
express.json()
仅当请求具有Content-Type: application/json
. 因此,您可以在此之后添加将 YAML 解析为 JSON 的中间件:
const yaml = require("js-yaml");
const {Writable} = require("stream");
app.use(express.json(), function(req, res, next) {
if (req.get("content-type").startsWith("text/yaml")) {
var buffers = [];
req.pipe(new Writable({
write(chunk, encoding, callback) {
buffers.push(chunk);
callback();
},
final(callback) {
try {
req.body = yaml.load(Buffer.concat(buffers).toString());
next();
} catch(e) {
next(e);
}
}
}))
} else
next();
});
请注意,这不处理压缩的请求有效负载。
推荐阅读
- flutter - Dart - 如何在没有元素的情况下获取 Iterable 元素的`runtimeType`?
- assembly - 编辑或创建链接的 dll 文件
- git - Big git merge - 跨提交拆分分辨率
- .net - 在 CefSharp 的 PDF 查看器中隐藏或禁用下载按钮和打印按钮
- java - 使用java从JSON获取动态子数组
- magento2 - 添加动态自定义费用 magento 2
- python - 如何删除数据框所有列中仅包含 NaN 值的行?
- android - 在 Android 应用程序中使用移动数据访问互联网时使用没有网关/互联网连接的本地 Wifi (Flutter)
- python - 如何将元组中的特定值传递给函数
- mathematical-optimization - 如何获得千里眼重启所需的时间?