applyDecorators से Decorators का संयोजन
swagger, सत्यापन और प्रमाणीकरण decorators को एक सुविधाजनक @ApiSecureEndpoint decorator में बाँधिए।
applyDecorators से Decorators का संयोजन, CoddyKit पर NestJS एंटरप्राइज़ बैकएंड API का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह NestJS एंटरप्राइज़ बैकएंड API सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। NestJS एंटरप्राइज़ बैकएंड API पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
डेकोरेटरों की परत की समस्या
वास्तविक NestJS एंटरप्राइज़ API में लगभग हर रूट हैंडलर पर डेकोरेटरों की एक लंबी परत आ जाती है: Swagger दस्तावेज़, प्रमाणीकरण गार्ड, भूमिका-जाँच और प्रतिक्रिया का रूप-निर्धारण। हर एंडपॉइंट पर इस परत को दोहराना लंबा और त्रुटि-प्रवण होता है।
- दोहराव: वही छह पंक्तियाँ दर्जनों हैंडलर पर कॉपी की जाती हैं।
- असंगति: कोई व्यक्ति किसी एक रूट पर
@ApiBearerAuth()लगाना भूल जाता है और दस्तावेज़ गलत जानकारी देने लगते हैं। - अनावश्यक शोर: वास्तविक व्यावसायिक उद्देश्य साझा चिंताओं के नीचे दब जाता है।
यह पाठ बताता है कि NestJS के applyDecorators का उपयोग करके बार-बार आने वाली डेकोरेटर परत को एक ही पुनःप्रयोग योग्य @ApiSecureEndpoint() में कैसे बदला जाए।
// The pain: this stack repeats on every secured route
@Post('transfer')
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles('admin')
@ApiBearerAuth()
@ApiOperation({ summary: 'Move funds between accounts' })
@ApiOkResponse({ description: 'Transfer accepted' })
@ApiUnauthorizedResponse({ description: 'Missing or invalid token' })
async transfer(@Body() dto: TransferDto) {
return this.bank.transfer(dto);
}applyDecorators वास्तव में क्या करता है
applyDecorators, @nestjs/common का एक सहायक है। यह कितने भी डेकोरेटर ले सकता है और एक नया डेकोरेटर लौटाता है, जो उपयोग किए जाने पर उन सभी को क्रम से लागू करता है।
- यह मेथड डेकोरेटर, क्लास डेकोरेटर और प्रॉपर्टी डेकोरेटर के साथ काम करता है।
- डेकोरेटर ऊपर से नीचे की ओर चलते हैं, ठीक वैसे ही जैसे आपने उन्हें हाथ से लिखा हो।
- यह व्यवहार नहीं बदलता—यह केवल संयोजन करता है। मूल परत जो कुछ करती थी, संयोजित डेकोरेटर भी वही करता है।
इसे डेकोरेटरों की दुनिया में फ़ंक्शन संयोजन की तरह समझें।
import { applyDecorators, UseGuards } from '@nestjs/common';
import { ApiBearerAuth, ApiOperation } from '@nestjs/swagger';
export function SecureRoute() {
return applyDecorators(
UseGuards(JwtAuthGuard),
ApiBearerAuth(),
ApiOperation({ summary: 'Protected route' }),
);
}कस्टम डेकोरेटर केवल एक फ़ंक्शन है
संयोजन करने से पहले कस्टम डेकोरेटर का स्वरूप याद करें। मेथड डेकोरेटर वह फ़ंक्शन है जिसे लक्ष्य, प्रॉपर्टी कुंजी और प्रॉपर्टी डिस्क्रिप्टर प्राप्त होते हैं। UseGuards() जैसे NestJS डेकोरेटर डेकोरेटर फ़ैक्टरी होते हैं: उन्हें कॉल करने पर ऐसा फ़ंक्शन मिलता है।
यह सादा-TypeScript उदाहरण बिना किसी फ़्रेमवर्क के इसकी कार्यप्रणाली दिखाता है—क्लास मेथड पर लागू की गई लॉग दर्ज करने वाली डेकोरेटर फ़ैक्टरी।
function LogCalls(label: string) {
return function (
_target: object,
key: string,
descriptor: PropertyDescriptor,
) {
const original = descriptor.value;
descriptor.value = function (...args: unknown[]) {
console.log(`[${label}] ${key} called`);
return original.apply(this, args);
};
};
}
class Calculator {
@LogCalls('math')
add(a: number, b: number): number {
return a + b;
}
}
const c = new Calculator();
console.log('result =', c.add(2, 3));सहायक के बिना संयोजन
applyDecorators को बेहतर समझने के लिए देखें कि शुद्ध TypeScript में मैन्युअल संयोजन कैसा दिखता है। एक संयोजक ऐसा एकल मेथड डेकोरेटर लौटाता है, जो आंतरिक डेकोरेटरों पर लूप चलाकर प्रत्येक को लागू करता है।
यह स्वतंत्र अंश दिखाता है कि NestJS का applyDecorators अंदर से कैसे काम करता है—हर डेकोरेटर को उसी लक्ष्य पर चलाकर।
type MethodDec = (t: object, k: string, d: PropertyDescriptor) => void;
function compose(...decorators: MethodDec[]): MethodDec {
return (target, key, descriptor) => {
for (const dec of decorators) {
dec(target, key, descriptor);
}
};
}
const tag = (name: string): MethodDec => (_t, k) =>
console.log(`applied ${name} to ${k}`);
class Service {
@compose(tag('auth'), tag('swagger'), tag('roles'))
handle(): string {
return 'ok';
}
}
console.log(new Service().handle());@ApiSecureEndpoint का पहला संस्करण बनाना
अब वास्तविक डेकोरेटर परत को एक साथ बाँधें। हमारे लक्ष्य डेकोरेटर @ApiSecureEndpoint() को JWT प्रमाणीकरण, भूमिका-प्रवर्तन, Swagger bearer योजना और सामान्य त्रुटि-प्रतिक्रियाएँ जोड़नी चाहिए।
UseGuardsरनटाइम सुरक्षा को जोड़ता है।ApiBearerAuthSwagger UI को टोकन भेजने के लिए कहता है।ApiUnauthorizedResponse/ApiForbiddenResponseविफलता की स्थितियों का एक ही बार दस्तावेज़ीकरण करते हैं।
import { applyDecorators, UseGuards } from '@nestjs/common';
import {
ApiBearerAuth,
ApiUnauthorizedResponse,
ApiForbiddenResponse,
} from '@nestjs/swagger';
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
import { RolesGuard } from '../auth/roles.guard';
export function ApiSecureEndpoint() {
return applyDecorators(
UseGuards(JwtAuthGuard, RolesGuard),
ApiBearerAuth(),
ApiUnauthorizedResponse({ description: 'Missing or invalid token' }),
ApiForbiddenResponse({ description: 'Insufficient permissions' }),
);
}संयोजित डेकोरेटर का उपयोग
संयोजक तैयार होने पर नियंत्रक में हर रूट के लिए केवल उद्देश्य स्पष्ट करने वाली एक पंक्ति रह जाती है। चारों चिंताएँ अब भी सक्रिय हैं—बस उन्हें फ़ैक्टरी के अंदर एक बार घोषित किया गया है।
दृश्य 1 से तुलना करें: वही सुरक्षा और दस्तावेज़ीकरण, लेकिन बहुत कम अनावश्यक शोर।
@Controller('accounts')
export class AccountsController {
constructor(private readonly bank: BankService) {}
@Post('transfer')
@ApiSecureEndpoint()
@ApiOperation({ summary: 'Move funds between accounts' })
async transfer(@Body() dto: TransferDto) {
return this.bank.transfer(dto);
}
}संयोजक में तर्क पास करना
फ़ैक्टरी को पैरामीटरयुक्त बनाना वास्तविक सुविधा देता है। चूँकि ApiSecureEndpoint एक फ़ंक्शन है, यह विकल्प स्वीकार करके उन्हें आंतरिक डेकोरेटरों तक पहुँचा सकता है—जैसे आवश्यक भूमिकाएँ और सारांश स्ट्रिंग।
इससे एक ही पठनीय कॉल में रूट की पूरी सुरक्षा और दस्तावेज़ीकरण संबंधी शर्त व्यक्त की जा सकती है।
import { applyDecorators, UseGuards, SetMetadata } from '@nestjs/common';
import { ApiBearerAuth, ApiOperation, ApiForbiddenResponse } from '@nestjs/swagger';
export const ROLES_KEY = 'roles';
export function ApiSecureEndpoint(opts: { summary: string; roles?: string[] }) {
return applyDecorators(
UseGuards(JwtAuthGuard, RolesGuard),
SetMetadata(ROLES_KEY, opts.roles ?? []),
ApiBearerAuth(),
ApiOperation({ summary: opts.summary }),
ApiForbiddenResponse({ description: 'Insufficient permissions' }),
);
}सत्यापन और प्रतिक्रिया-प्रकार जोड़ना
एंटरप्राइज़ एंडपॉइंट अपनी सफल प्रतिक्रिया के पेलोड का भी दस्तावेज़ीकरण करते हैं। applyDecorators में टाइप वाले ApiOkResponse को शामिल किया जा सकता है और इसे क्रमबद्धीकरण इंटरसेप्टर के साथ मिलाया जा सकता है, ताकि शर्त कोड और दस्तावेज़—दोनों में लागू हो।
typeSwagger प्रतिक्रिया स्कीमा और उदाहरण तय करता है।UseInterceptors(ClassSerializerInterceptor)जोड़ने से DTO रूपांतरण लागू होना सुनिश्चित होता है।
import { applyDecorators, UseGuards, UseInterceptors, ClassSerializerInterceptor, Type } from '@nestjs/common';
import { ApiBearerAuth, ApiOkResponse, ApiOperation } from '@nestjs/swagger';
export function ApiSecureEndpoint(opts: {
summary: string;
type: Type<unknown>;
}) {
return applyDecorators(
UseGuards(JwtAuthGuard, RolesGuard),
UseInterceptors(ClassSerializerInterceptor),
ApiBearerAuth(),
ApiOperation({ summary: opts.summary }),
ApiOkResponse({ type: opts.type, description: 'Success' }),
);
}गार्ड और इंटरसेप्टर के लिए क्रम महत्वपूर्ण है
संयोजित डेकोरेटर के अंदर UseGuards और UseInterceptors का आपसी क्रम रनटाइम पर महत्वपूर्ण होता है। NestJS हमेशा इंटरसेप्टर से पहले गार्ड चलाता है, लेकिन कई गार्डों का निष्पादन-क्रम सारणी के क्रम का अनुसरण करता है और कई इंटरसेप्टर घोषणा-क्रम में एक-दूसरे के अंदर चलते हैं।
- प्रमाणीकरण गार्ड को प्राधिकरण गार्ड से पहले रखें, ताकि बिना प्रमाणीकरण वाला अनुरोध 403 के बजाय 401 के साथ तुरंत रुक जाए।
- केवल Swagger वाले डेकोरेटर (
ApiOperation,ApiOkResponse) का रनटाइम क्रम पर कोई प्रभाव नहीं होता—वे केवल मेटाडेटा जोड़ते हैं।
// JwtAuthGuard first => 401 before RolesGuard ever runs => correct
UseGuards(JwtAuthGuard, RolesGuard)
// Reversed => RolesGuard may read an empty user and throw 403
// for a request that was actually just unauthenticated
UseGuards(RolesGuard, JwtAuthGuard) // avoidडेकोरेटर को परीक्षण योग्य बनाए रखना
संयोजित डेकोरेटर एक सादा फ़ैक्टरी फ़ंक्शन होता है, इसलिए Nest शुरू किए बिना यह इकाई-परीक्षण किया जा सकता है कि वह अपेक्षित मेटाडेटा जोड़ता है या नहीं। Reflector का उपयोग करें या सजाए गए मेथड से सीधे मेटाडेटा कुंजियाँ पढ़ें।
यह स्वतंत्र TypeScript उदाहरण मूल विचार दिखाता है—Reflect.defineMetadata के माध्यम से डेकोरेटर द्वारा जोड़े गए मेटाडेटा को वापस पढ़ना।
import 'reflect-metadata';
function Roles(...roles: string[]) {
return (t: object, k: string) =>
Reflect.defineMetadata('roles', roles, t, k);
}
class Ctrl {
@Roles('admin', 'auditor')
remove() {}
}
const meta = Reflect.getMetadata('roles', Ctrl.prototype, 'remove');
console.log('declared roles =', meta);
console.log('admin allowed =', meta.includes('admin'));कब संयोजन न करें
संयोजन शक्तिशाली है, लेकिन महत्वपूर्ण विवरण छिपा सकता है। संयोजित डेकोरेटर का उपयोग तभी करें जब परत वास्तव में बार-बार आती हो और स्थिर हो।
- संयोजन करें ऐसे निश्चित सुरक्षा और दस्तावेज़ीकरण आवरण का, जिसका उपयोग कई रूटों पर होता है।
- संयोजन से बचें अत्यधिक रूट-विशिष्ट विवरणों के लिए, जैसे किसी विशिष्ट
ApiOperationका सारांश या केवल एक बार उपयोग होने वाले क्वेरी पैरामीटर—इनको तर्क के रूप में पास करें या वहीं लिखें। - छिपाने से बचें कम उपयोग होने वाले व्यवहार को; पाठक को अब भी डेकोरेटर देखकर समझ आना चाहिए कि रूट क्या करता है।
अच्छे संयोजित डेकोरेटर ब्लैक बॉक्स बने बिना अनावश्यक शोर कम करते हैं।
त्वरित जाँच: डेकोरेटरों का संयोजन
आप ऐसा एकल @ApiSecureEndpoint() चाहते हैं, जो JWT गार्ड, भूमिका गार्ड, Swagger bearer योजना और साझा त्रुटि-प्रतिक्रियाएँ लागू करे। NestJS में इसका प्रचलित तरीका क्या है?
पुनरावलोकन और मुख्य बातें
आपने दोहराई जाने वाली डेकोरेटर परत को एक सुविधाजनक डेकोरेटर में बदलना सीखा।
@nestjs/commonकाapplyDecoratorsकितने भी डेकोरेटरों को एक ऐसे डेकोरेटर में संयोजित करता है, जो उन्हें क्रम से लागू करता है।- संयोजित डेकोरेटर केवल एक फ़ैक्टरी फ़ंक्शन है, इसलिए यह विकल्प (भूमिकाएँ, सारांश, प्रतिक्रिया प्रकार) स्वीकार करके उन्हें आंतरिक डेकोरेटरों तक पहुँचा सकता है।
- स्थिर साझा चिंताओं को एक साथ रखें—
UseGuards,ApiBearerAuth, साझाApiUnauthorizedResponse/ApiForbiddenResponse—और रूट-विशिष्ट विवरणों को तर्क के रूप में या वहीं लिखें। - गार्ड के क्रम का ध्यान रखें: प्रमाणीकरण को प्राधिकरण से पहले रखें, ताकि टोकन न होने पर 403 के बजाय 401 मिले।
- सादा TypeScript होने के कारण संयोजित डेकोरेटर रिफ्लेक्ट किए गए मेटाडेटा के माध्यम से परीक्षण योग्य रहता है।
परिणाम: नियंत्रक बॉयलरप्लेट की दीवार के बजाय उद्देश्य के रूप में पढ़े जाते हैं (@ApiSecureEndpoint({ summary, roles }))।
एआई शिक्षक के साथ TypeScript सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 20
- पाठ
- 76
अक्सर पूछे जाने वाले प्रश्न
क्या “applyDecorators से Decorators का संयोजन” पाठ निःशुल्क है?
हाँ—“applyDecorators से Decorators का संयोजन” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और NestJS एंटरप्राइज़ बैकएंड API पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। NestJS एंटरप्राइज़ बैकएंड API पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“applyDecorators से Decorators का संयोजन” में मैं क्या सीखूँगा?
swagger, सत्यापन और प्रमाणीकरण decorators को एक सुविधाजनक @ApiSecureEndpoint decorator में बाँधिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ NestJS एंटरप्राइज़ बैकएंड API का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या NestJS एंटरप्राइज़ बैकएंड API शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर NestJS एंटरप्राइज़ बैकएंड API शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“applyDecorators से Decorators का संयोजन” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस NestJS एंटरप्राइज़ बैकएंड API पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर NestJS एंटरप्राइज़ बैकएंड API पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Param Decorators से अनुरोध कॉन्टेक्स्ट पढ़ना
- SetMetadata और Reflector से मेटाडेटा जोड़ना
- applyDecorators से Decorators का संयोजन
- क्रॉस-कटिंग कॉन्फ़िगरेशन के लिए Class-Level Decorators