以条带形式发送到客户端后无法设置 headers

Cannot set headers after they are sent to the client in stripe

我正在设置一个条纹 webhook 来检查付款意图是否成功。但是在这样做的时候,我收到了这个错误 Cannot set headers after they are sent to the client in stripe,我在路线中做错了什么?

import express from 'express';
import Stripe from "stripe";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY, { apiVersion: "2020-08-27" });

const router = express.Router();

router.post(
    "/webhook",
    express.raw({ type: "*/*" }),
    async (request, response) => {
        const sig = request.headers["stripe-signature"];

        let event;

        try {
            event = stripe.webhooks.constructEvent(
                request.body,
                sig,
                process.env.STRIPE_WEBHOOK_SECRET_KEY
            );
              console.log("type", event);
        } catch (err) {
            //   console.log("type2", err);
            response.status(400).send(`Webhook Error: ${err.message}`);
        }

        response.json({ received: true });
    }
);

export default router;

如果 url 指向 webhook 服务

,这里有一个部分 https://stripe.com/docs/identity/handle-verification-outcomes 会跳过正文解析
app.use((req, res, next) => {
  if (req.originalUrl === '/webhook') {
    next();
  } else {
    bodyParser.json()(req, res, next);
  }
});

这可能是问题所在:webhook 希望您不要执行 express.raw() 如果您要给他 request.body 来分析

在你没有返回的 catch 块中。

catch (err) {
            //   console.log("type2", err);
            return response.status(400).send(`Webhook Error: ${err.message}`);
        }

您正尝试在错误处理发送带有 response.status(400).send() 的 400 响应后发送带有 response.json() 的 json 响应 -- 您不能这样做。

您需要将 response.json() 移动到 try 块的末尾,或者让 catchreturn(如@abhishek 所述)停止执行。