如何访问 Fastify 请求的原始主体?

How do I access the raw body of a Fastify request?

如你所想,我对 Express 很熟悉,但这是我第一次使用 Fastify。

我想访问 Fastify 请求的 unmodified 正文,以对 webhook 进行签名验证 - 即,我想在收到请求时查看它,未被任何中间件修改。在 Express 中,这通常是通过访问 request.rawBody 来完成的。

如何访问 Fastify 请求的原始主体?

有个issue on GitHub for rawBody support

还有一个模块:"raw-body"。在 Fastify 中使用这个模块:

const rawBody = require('raw-body')

fastify.addContentTypeParser('*', (req, done) => {
    rawBody(req, {
        length: req.headers['content-length'],
        limit: '1mb',
        encoding: 'utf8', // Remove if you want a buffer
    }, (err, body) => {
        if (err) return done(err)
        done(null, parse(body))
    })
})

希望对你有所帮助,我也是 fastify 的新手

注意:Fastify 请求只能有req.body——他们不能有,例如,req.body 和 req.rawBody 与其他 Web 服务器(例如,Express)一样。这是因为 addContentTypeParser() 仅 returns 修改了 body,它不能向请求添加任何其他内容。

相反,在内容类型解析器中,我们添加到一个路由,我们制作:

  • req.body.parsed(对象,与通常在 req.body 中的内容相同)
  • req.body.raw(字符串)

有关更多信息,请参阅 GitHub and the addContentTypeParser() 文档。

  server.addContentTypeParser(
    "application/json",
    { parseAs: "string" },
    function (req, body, done) {
      try {
        var newBody = {
          raw: body,
          parsed: JSON.parse(body),
        };
        done(null, newBody);
      } catch (error) {
        error.statusCode = 400;
        done(error, undefined);
      }
    }
  );