सभी लेख
rawBody सक्षम NestJS सर्वर guard से req.rawBody पर webhook सिग्नेचर सत्यापित करता है, nest start लोकल टनल से expose।
NestJSNode.jswebhook debugginglocal testing

NestJS वेबहुक: rawBody, signature guard और ValidationPipe जाल

NestJS webhook handler सूक्ष्म रूप से फेल होते हैं। Global ValidationPipe guard से पहले field हटाता है और default JSON parsing provider द्वारा sign किए bytes नष्ट करता है। Stripe या GitHub में tunnel URL चिपकाने से पहले rawBody: true, signature guard और route-scoped validation साबित करें।

bootstrap पर raw body सक्षम करें

Nest ऐप बनाते समय rawBody: true दें ताकि Express untouched buffer रखे:

async function bootstrap() {
  const app = await NestFactory.create(AppModule, { rawBody: true });
  app.useGlobalPipes(new ValidationPipe({ whitelist: true }));
  await app.listen(3000);
}

इस flag के बिना req.rawBody undefined है और हर HMAC fail होता है।

सिग्नेचर के लिए @Body() vs req.rawBody

@Body() से सिग्नेचर सत्यापित न करें — Nest object parse कर चुका है। raw-body middleware का buffer पढ़ें:

@Post('stripe')
@UseGuards(StripeSignatureGuard)
handleStripe(@Req() req: RawBodyRequest) {
  const payload = req.rawBody;
  const event = JSON.parse(payload.toString('utf8'));
  this.events.process(event);
  return { received: true };
}

guard पुष्टि के बाद ही JSON parse करें। क्रम: guard पहले, deserialize बाद में।

ValidationPipe प्रभाव से पहले signature guard

Provider verification को guard में encapsulate करें जो header पढ़े और digest compare करे:

@Injectable()
export class StripeSignatureGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const req = context.switchToHttp().getRequest>();
    const sig = req.headers['stripe-signature'] as string;
    return verify(req.rawBody, sig, process.env.STRIPE_WEBHOOK_SECRET);
  }
}

guard को केवल webhook route पर @UseGuards से लगाएँ।

Global ValidationPipe जाल से बचें

transform: true वाला global ValidationPipe controller से पहले type coerce कर सकता है। webhook route को rawBody + verification के बाद manual JSON.parse चाहिए।

nest start + PortPreview से लोकल टेस्ट

  1. API चलाएँ: npm run start:dev या nest start --watch पोर्ट 3000।
  2. Expose: npx portpreview 3000
  3. tunnel URL + webhook path register करें।
  4. टेस्ट delivery trigger करें।
  5. duplicate event ID replay — retry पैटर्न

आम जाल

सिग्नेचर से पहले ValidationPipe

validation पहले चले तो Nest body transform कर rawBody खाली छोड़ सकता है। guard raw buffer पर चलना चाहिए।

Global JSON middleware क्रम

raw-body से पहले Express json() stream consume करता है। factory बनाते समय rawBody: true रखें।

धीमे handler और retry

verification के बाद तेज़ 200, भारी काम queue में, event ID से dedupe।

और पढ़ें

मूल बातें पढ़ें localhost टनलिंग और लोकल webhook डिबगिंग. सिग्नेचर मैकेनिक्स के लिए देखें सिग्नेचर सत्यापन गाइड. डुप्लिकेट-सुरक्षित हैंडलर के लिए पढ़ें retry और idempotency पैटर्न. PortPreview मुफ़्त शुरू करें.

अक्सर पूछे जाने वाले प्रश्न

NestJS webhook में req.rawBody undefined क्यों है?
NestFactory.create में rawBody: true दें। इसके बिना Express raw buffer attach नहीं करता।
NestJS में @Body() से सिग्नेचर सत्यापित कर सकते हैं?
नहीं। @Body() parsed object देता है, signed bytes नहीं। rawBody: true के साथ req.rawBody इस्तेमाल करें।
NestJS webhook को लोकल कैसे टेस्ट करें?
3000 पर nest start चलाएँ, npx portpreview से expose करें, टनल URL register करें और टेस्ट इवेंट भेजें।