Joi और forRoot से Schema-Validated Env
ConfigModule.forRoot में Joi स्कीमा से environment variables का सत्यापन करके बूट के समय तुरंत विफलता पहचानिए।
Joi और forRoot से Schema-Validated Env, CoddyKit पर NestJS एंटरप्राइज़ बैकएंड API का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह NestJS एंटरप्राइज़ बैकएंड API सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। NestJS एंटरप्राइज़ बैकएंड API पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
बूट के समय Env को मान्य क्यों करें?
एंटरप्राइज़ NestJS सेवाओं में कॉन्फ़िगरेशन पर्यावरण चर में रहता है। कोई अनुपस्थित DATABASE_URL या PORT=tree जैसी टाइपिंग की गलती कभी भी प्रोडक्शन ट्रैफ़िक तक नहीं पहुँचनी चाहिए।
- तुरंत विफलता: पहली अनुरोध के तीन घंटे बाद नहीं, बल्कि स्टार्टअप पर ही क्रैश हो।
- सत्य का एकमात्र स्रोत: एक स्कीमा आपके ऐप के लिए आवश्यक हर चर का दस्तावेज़ बने।
- प्रकार सुरक्षा: स्ट्रिंग को पहले ही संख्या और बूलियन में बदल दें।
इस पाठ में Joi स्कीमा को ConfigModule.forRoot से जोड़ा गया है, ताकि पर्यावरण अमान्य होने पर प्रक्रिया बूट होने से इनकार कर दे।
मान्यता के बिना समस्या
मान्यता के बिना NestJS खराब कॉन्फ़िगरेशन के साथ भी आसानी से शुरू हो जाता है। समस्या बाद में किसी सेवा के भीतर गहराई में जाकर एक उलझन भरी त्रुटि के रूप में सामने आती है।
नीचे, PORT एक स्ट्रिंग के रूप में आता है और गणना चुपचाप गलत हो जाती है। वास्तविक ऐप में रनटाइम पर undefined सीक्रेट का संदर्भ लेने की समस्या भी हो सकती है।
// A common silent bug: env vars are always strings
const PORT = process.env.PORT; // "3000" or undefined
// Expecting a number, but string concatenation happens instead
const nextPort = PORT + 1;
console.log('PORT:', PORT);
console.log('nextPort (wrong):', nextPort); // "30001", not 3001
// Missing secret is undefined, not an error
const secret = process.env.JWT_SECRET;
console.log('JWT_SECRET present?', secret !== undefined);आवश्यक पैकेज स्थापित करना
आपको दो पैकेज चाहिए: Nest का कॉन्फ़िगरेशन मॉड्यूल और Joi स्वयं।
@nestjs/config,dotenvको लपेटता है औरConfigServiceउपलब्ध कराता है।joiवह स्कीमा/मान्यता लाइब्रेरी है जिसेforRootअंदरूनी रूप से कॉल करता है।
Joi अपने TypeScript प्रकारों के साथ आता है, इसलिए अलग @types पैकेज की आवश्यकता नहीं होती।
# Install the config module and Joi
npm install @nestjs/config joiपहला Joi स्कीमा
Joi स्कीमा एक ऐसी वस्तु है जो प्रत्येक चर के प्रकार, अनुमत मानों और डिफ़ॉल्ट मानों का वर्णन करती है। मान्यता process.env के विरुद्ध चलती है।
यह अंश केवल Node + Joi का है (Nest के बिना), ताकि आप ठीक-ठीक देख सकें कि forRoot अंदर से क्या करता है।
const Joi = require('joi');
const schema = Joi.object({
NODE_ENV: Joi.string()
.valid('development', 'production', 'test')
.default('development'),
PORT: Joi.number().port().default(3000),
});
const { error, value } = schema.validate(
{ PORT: '8080' },
{ abortEarly: false, allowUnknown: true },
);
console.log('error:', error ? error.message : 'none');
console.log('PORT type:', typeof value.PORT, value.PORT); // number 8080
console.log('NODE_ENV default:', value.NODE_ENV);स्कीमा को forRoot से जोड़ना
स्कीमा को validationSchema के रूप में ConfigModule.forRoot को दें। isGlobal: true का उपयोग करें, ताकि ConfigService को दोबारा इम्पोर्ट किए बिना हर जगह इंजेक्ट किया जा सके।
यदि पर्यावरण स्कीमा में सफल नहीं होता, तो Nest मॉड्यूल आरंभ होने के दौरान त्रुटि देता है और प्रक्रिया शून्य से अलग निकास कोड के साथ बंद हो जाती है।
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import * as Joi from 'joi';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
validationSchema: Joi.object({
NODE_ENV: Joi.string()
.valid('development', 'production', 'test')
.default('development'),
PORT: Joi.number().port().default(3000),
DATABASE_URL: Joi.string().uri().required(),
JWT_SECRET: Joi.string().min(32).required(),
}),
}),
],
})
export class AppModule {}Required बनाम Default
Joi के दो सबसे महत्वपूर्ण संशोधक आपकी तुरंत-विफलता नीति तय करते हैं:
.required()— चर अनुपस्थित होने पर बूट विफल होना चाहिए। इसका उपयोग सीक्रेट और कनेक्शन स्ट्रिंग के लिए करें।.default(value)— सुरक्षित डिफ़ॉल्ट देकर चर को वैकल्पिक बनाएँ।
JWT_SECRET जैसे सीक्रेट को कभी डिफ़ॉल्ट मान न दें; इससे गलत कॉन्फ़िगरेशन छिप जाती है और एक ज्ञात कुंजी भेजी जाती है।
import * as Joi from 'joi';
export const validationSchema = Joi.object({
// Optional with a sensible fallback
LOG_LEVEL: Joi.string()
.valid('debug', 'info', 'warn', 'error')
.default('info'),
// Mandatory: no default, must be provided
DATABASE_URL: Joi.string().uri().required(),
JWT_SECRET: Joi.string().min(32).required(),
});प्रकार परिवर्तन और बूलियन
हर पर्यावरण चर एक स्ट्रिंग होता है। Joi उन्हें इस तरह बदलता है कि ConfigService.get वास्तविक प्रकार लौटाए।
Joi.number(),"5432"को5432में बदलता है।Joi.boolean(),"true"/"false"को वास्तविक बूलियन के रूप में समझता है।
सिर्फ मौजूदगी जाँचने की तुलना में Joi का अतिरिक्त लाभ यही प्रकार परिवर्तन है।
const Joi = require('joi');
const schema = Joi.object({
DB_PORT: Joi.number().default(5432),
CACHE_ENABLED: Joi.boolean().default(false),
});
const { value } = schema.validate(
{ DB_PORT: '6543', CACHE_ENABLED: 'true' },
{ allowUnknown: true },
);
console.log(typeof value.DB_PORT, value.DB_PORT); // number 6543
console.log(typeof value.CACHE_ENABLED, value.CACHE_ENABLED); // boolean truevalidationOptions: हर त्रुटि की रिपोर्ट करें
डिफ़ॉल्ट रूप से Joi पहली त्रुटि पर रुक जाता है (abortEarly: true)। CI और स्थानीय सेटअप में आपको पूरी सूची चाहिए, इसलिए validationOptions दें।
abortEarly: false— सभी अनुपस्थित या अमान्य चरों को एक साथ एकत्र करके प्रिंट करें।allowUnknown: true—PATHजैसे अतिरिक्त OS चरों को स्वीकार करें (यह डिफ़ॉल्ट है)।
import { ConfigModule } from '@nestjs/config';
import * as Joi from 'joi';
ConfigModule.forRoot({
isGlobal: true,
validationSchema: Joi.object({
DATABASE_URL: Joi.string().uri().required(),
JWT_SECRET: Joi.string().min(32).required(),
REDIS_URL: Joi.string().uri().required(),
}),
validationOptions: {
abortEarly: false, // show ALL problems, not just the first
allowUnknown: true,
},
});Joi.when से सशर्त नियम
एंटरप्राइज़ कॉन्फ़िगरेशन पर्यावरण के अनुसार अलग-अलग होते हैं। Joi इसे .when() के माध्यम से व्यक्त करता है: केवल प्रोडक्शन में नियमों को अधिक कड़ा करें।
यहाँ, जब NODE_ENV का मान production हो, तब TLS सक्षम होना और sentry DSN मौजूद होना आवश्यक है; अन्यथा ये वैकल्पिक रहेंगे।
import * as Joi from 'joi';
export const validationSchema = Joi.object({
NODE_ENV: Joi.string()
.valid('development', 'production', 'test')
.default('development'),
DB_SSL: Joi.boolean().when('NODE_ENV', {
is: 'production',
then: Joi.valid(true).required(),
otherwise: Joi.boolean().default(false),
}),
SENTRY_DSN: Joi.string().uri().when('NODE_ENV', {
is: 'production',
then: Joi.required(),
otherwise: Joi.optional(),
}),
});सेवा में मान्य कॉन्फ़िगरेशन पढ़ना
मान्यता सफल होने के बाद ConfigService को इंजेक्ट करें और टाइप किए गए मान पढ़ें। सही वापसी प्रकार के लिए सामान्य रूप get<number> का उपयोग करें।
क्योंकि स्कीमा मौजूदगी की गारंटी देता है, इसलिए आवश्यक कुंजियों के लिए आप सुरक्षित रूप से नॉन-नल का दावा कर सकते हैं।
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
@Injectable()
export class DatabaseConfig {
constructor(private readonly config: ConfigService) {}
get url(): string {
// Required in the schema, so it is guaranteed present
return this.config.get<string>('DATABASE_URL')!;
}
get port(): number {
// Already coerced to a number by Joi
return this.config.get<number>('DB_PORT', 5432);
}
}बूट विफलता कैसी दिखती है
मान्यता विफल होने पर Nest पोर्ट पर सुनना शुरू करने से पहले ही त्रुटि देता है। संदेश हर समस्या वाले चर की सूची देता है, जो डिप्लॉयमेंट की समस्या खोजने में बहुत उपयोगी है।
abortEarly: false के साथ होने वाली सामान्य क्रैश कई समस्याओं की एक साथ रिपोर्ट करती है।
// Simulated message thrown by @nestjs/config on bad env
// Error: Config validation error:
// "DATABASE_URL" is required.
// "JWT_SECRET" length must be at least 32 characters long.
// "PORT" must be a valid port.
//
// Process exits with a non-zero code; no requests are served.
console.log('Boot aborted: fix the env vars listed above.');त्वरित जाँच
तुरंत-विफलता वाली पर्यावरण मान्यता की अपनी समझ जाँचें।
पुनरावलोकन
आपने Joi की सहायता से कॉन्फ़िगरेशन को तुरंत विफल होना सिखाया:
Joi.objectस्कीमा कोvalidationSchemaके रूप मेंConfigModule.forRootको दें औरisGlobal: trueरखें।- सीक्रेट और कनेक्शन स्ट्रिंग को
.required()से आवश्यक बनाएँ; सुरक्षित मानों को.default()दें; सीक्रेट को कभी डिफ़ॉल्ट न दें। - Joi स्ट्रिंग को संख्या और बूलियन में बदलता है, इसलिए
ConfigService.getवास्तविक प्रकार लौटाता है। - हर समस्या को एक साथ दिखाने के लिए
validationOptions.abortEarly: falseसेट करें। - प्रोडक्शन में अधिक कड़े नियम लागू करने के लिए
.when()का उपयोग करें।
लाभ यह है कि खराब पर्यावरण स्टार्टअप पर स्पष्ट सूची के साथ क्रैश होता है, अनुरोध के बीच में चुपचाप नहीं।
एआई शिक्षक के साथ TypeScript सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 20
- पाठ
- 76
अक्सर पूछे जाने वाले प्रश्न
क्या “Joi और forRoot से Schema-Validated Env” पाठ निःशुल्क है?
हाँ—“Joi और forRoot से Schema-Validated Env” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और NestJS एंटरप्राइज़ बैकएंड API पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। NestJS एंटरप्राइज़ बैकएंड API पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Joi और forRoot से Schema-Validated Env” में मैं क्या सीखूँगा?
ConfigModule.forRoot में Joi स्कीमा से environment variables का सत्यापन करके बूट के समय तुरंत विफलता पहचानिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ NestJS एंटरप्राइज़ बैकएंड API का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या NestJS एंटरप्राइज़ बैकएंड API शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर NestJS एंटरप्राइज़ बैकएंड API शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।
“Joi और forRoot से Schema-Validated Env” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस NestJS एंटरप्राइज़ बैकएंड API पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर NestJS एंटरप्राइज़ बैकएंड API पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Joi और forRoot से Schema-Validated Env
- registerAs से नेमस्पेस्ड Config
- HashiCorp Vault और AWS SSM से Secrets लोड करना
- प्रति-Environment Config और सुरक्षित Defaults