Next.js中如何在事件处理全程保留并访问请求体?
解决Stripe Webhook请求体无法重复访问的问题
问题根源是NextRequest的请求体是可读流,只能被读取一次,你已经用request.text()读取了请求体,后续再访问request.body自然会失败。解决办法是提前将读取到的payload转换为可用格式并保存,在事件处理环节直接复用这个保存好的数据。
修改后的代码示例:
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!); export async function POST(request: NextRequest) { const endpointSecret = process.env.NEXT_WEBHOOK_ENDPOINT_SECRET; let data; let eventType; let parsedBody; // 保存解析后的请求体 if (endpointSecret) { let event; const payload = await request.text(); const sig = request.headers.get("stripe-signature"); // 提前解析请求体为JSON对象 try { parsedBody = JSON.parse(payload); } catch (err) { console.error("Failed to parse request payload:", err); return NextResponse.json({ error: "Invalid payload" }, { status: 400 }); } try { event = stripe.webhooks.constructEvent(payload, sig!, endpointSecret); eventType = event.type; data = event.data.object; switch (event.type) { case 'customer.subscription.created': updateAPI(event.data.object, parsedBody); break; case 'customer.subscription.deleted': updateAPI(event.data.object, parsedBody); break; } } catch (err) { console.error("Webhook verification failed:", err); return NextResponse.json({ error: `Webhook Error: ${err.message}` }, { status: 400 }); } } return NextResponse.json({ received: true }); }
关键修改点:
- 新增
parsedBody变量,将读取到的payload解析为JSON对象并保存 - 事件处理时直接传入
parsedBody替代request.body - 添加了payload解析失败的错误处理,避免后续逻辑出错
内容的提问来源于stack exchange,提问作者Vedha
相关产品推荐
相关产品推荐

