如何使用无服务器函数获取 RAW Body?

How to get the RAW Body using serverless functions?

我正在 Zeit Now 上从 Express 迁移到无服务器函数。

Stripe webhook docs 请求原始 body 请求,使用 Express 时我可以通过 bodyParser 获取它,但它如何在无服务器函数上工作?如何接收字符串格式的 body 以验证条带签名?

支持团队将我重定向到此 documentation link,我很困惑,据我所知,我必须将 text/plain 传递到请求 header 中,但我没有可以控制它,因为 Stripe 是发送 webhook 的那个。

export default async (req, res) => {
    let sig = req.headers["stripe-signature"];
    let rawBody = req.body;
    let event = stripe.webhooks.constructEvent(rawBody, sig, process.env.STRIPE_SIGNING_SECRET);
    ...
}

在我的函数中,我收到 req.body 作为 object,我该如何解决这个问题?

以下代码片段对我有用(根据此 source 修改):

const endpointSecret = process.env.STRIPE_SIGNING_SECRET;

export default async (req, res) => {
  const sig = req.headers['stripe-signature'];
  let event;
  let bodyChunks = [];

  req
    .on('data', chunk => bodyChunks.push(chunk))
    .on('end', async () => {
      const rawBody = Buffer.concat(bodyChunks).toString('utf8');

      try {
        event = stripe.webhooks.constructEvent(rawBody, sig, endpointSecret);
      } catch (err) {
        return res.status(400).send(`Webhook Error: ${err.message}`);
      }

      // Handle event here
      ...

      // Return a response to acknowledge receipt of the event
      res.json({ received: true });
    });
};

export const config = {
  api: {
    bodyParser: false,
  },
};