解析多种请求主体的惯用方式(快速)

Idiomatic way of parsing multiple types of request bodies (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();
});

请注意,这不涉及压缩请求负载。