【问题标题】:Idiomatic way of parsing multiple types of request bodies (express)解析多种请求体的惯用方式(express)
【发布时间】:2021-11-14 11:10:13
【问题描述】:

我正在尝试找到解析多个(一些非 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',
  },
})

我需要从头开始编写正文解析器吗?我什至可以这样做吗?因为 express 在 json bodyparser 运行后似乎没有暴露原始主体?

【问题讨论】:

    标签: express mime-types body-parser


    【解决方案1】:

    我没有搜索过支持 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();
    });
    

    请注意,这不处理压缩的请求负载。

    【讨论】:

      猜你喜欢
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 2021-05-07
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多