Mundarija (28)
- Bu darsda
- 1. Nega bu kerak?
- 2. Papka va fayllar
- 2.1 Tuzilma
- 2.2 Kanon tajribasi: to'rt qatlam
- 2.3 Biz kengroq sinadik: qaysi fayllar o'qildi
- 3. Chuqur birlashtirish (deep merge)
- 3.1 Model
- 4. Env'ni ulash: custom-environment-variables.json
- 4.1 Xarita
- 4.2 Topilma: jim yo'qolgan maydon
- 5. API: get, has va o'zgarmaslik
- 6. NODE_ENV, NODE_CONFIG_ENV va strict mode
- 6.1 Ikki o'zgaruvchi
- 6.2 Biz topdik: xato yozilgan muhit nomi
- 6.3 Boshqa o'zgaruvchilar
- 7. Formatlar
- 8. Nega vazifalar-api ga kirmadi
- 9. API qadami: tajriba (holat 40, 2-qism)
- 10. Ko'p uchraydigan xatolar
- 11. Mashqlar
- 1-mashq (oson): natijani ayting
- 2-mashq (o'rta): qatlamli yig'uvchi
- 3-mashq (qiyin): __format ni xavfsiz qiling
- 4-mashq: API qadami
- 12. Real ishda
- Xulosa
- Manbalar
node-config: config/default.json, production.json va config iyerarxiyasi
Qisqacha: node-config (
configpaketi) sozlamalarniconfig/papkasidagi fayllardan qatlam-qatlam yig'adi:default.json→production.json(muhit nomi bo'yicha) →local.json→custom-environment-variables.json(env'dan). Har qatlam oldingisini chuqur birlashtiradi — faqat o'zida bor kalitlarni bosadi.config.get("server.port")— yo'q kalitda xato tashlaydi, obyekt o'zgartirib bo'lmaydi. Katta loyihalarda standart, lekin u qiymatlarni tekshirmaydi: kanon tajribasidaPORT=yuzbilan port maydoni jim yo'qoldi. Shuning uchunvazifalar-apiga kirmadi.
Bu darsda
config/papkasidagi fayllar qaysi tartibda o'qilishini va qanday birlashishini tushuntira olasiz.custom-environment-variables.jsonbilan env'ni ulaysiz (__name,__format).NODE_ENVvaNODE_CONFIG_ENVfarqini, strict mode ogohlantirishini bilasiz.config.get,config.has, o'zgarmaslik va fayl formatlarini (JSON5, YAML, TS) ishlatasiz.- node-config qachon kerak va qachon ortiqcha ekanini o'lchov bilan ayta olasiz.
Oldin bilishingiz kerak: Environment o'zgaruvchilar va .env, Obyekt nusxalash: shallow va deep, CommonJS va require.
1. Nega bu kerak?
Oldingi darsda hamma sozlama — env'da, tekis ro'yxatda: PORT, HOST, CORS_ORIGINS, LOG_LEVEL. 12 ta kalit — yaxshi. Endi katta loyihani tasavvur qiling: to'lov tizimlari (Click, Payme), uchta tashqi API, kesh, navbat, email shablonlari... 150 ta kalit. Ularning 120 tasi hamma muhitda bir xil, faqat 30 tasi farq qiladi.
150 ta qatorni har serverga env qilib yozish — xatolarning manbai. Bunday loyihalarda boshqa yondashuv ishlatiladi: sukut qiymatlar fayllarda, ierarxiya bilan, env esa faqat farq qiladigan va maxfiy narsalar uchun. Node ekotizimidagi eng mashhur vosita — node-config (npm'da config paketi, 2011 yildan).
O'xshatish: kiyim. Hamma kuni kiyadigan asosiy kiyim (default.json), ustiga ob-havoga qarab kurtka (production.json), uyda o'zingizga qulay tapochka (local.json), va eshikdan chiqayotganda kimdir qo'lingizga bergan soyabon (env). Har qatlam faqat o'z narsasini qo'shadi — kurtka kiyganingiz uchun shimingiz yo'qolib qolmaydi.
2. Papka va fayllar
2.1 Tuzilma
loyiha/
config/
default.json hamma muhit uchun asos
production.json NODE_ENV=production bo'lsa
test.json NODE_ENV=test bo'lsa
local.json shu kompyuter (git'da EMAS)
custom-environment-variables.json env → config xaritasi
src/Kodda:
import config from "config";
const port = config.get("server.port");
const host = config.get("server.host");config — CommonJS paket, lekin ESM'dan import bilan ham ishlaydi (CJS va ESM interop darsi).
2.2 Kanon tajribasi: to'rt qatlam
Kanon config@5.0.1 bilan (bog'liqligi bitta — json5) shunday fayllarni sinadi (t36-config.txt):
{ "server": { "port": 3000, "host": "127.0.0.1" },
"saqlash": "xotira", "cors": [] }Bu — default.json. production.json: { "server": { "host": "0.0.0.0" }, "saqlash": "fayl" }. local.json: { "server": { "port": 4100 } }. custom-environment-variables.json:
{ "server": { "port": { "__name": "PORT", "__format": "number" } } }Natijalar (server qismi va saqlash):
NODE_ENV yo'q: exit 0: {"port":4100,"host":"127.0.0.1"} xotira
NODE_ENV=production: exit 0: {"port":4100,"host":"0.0.0.0"} fayl
production + PORT=5000: exit 0: {"port":5000,"host":"0.0.0.0"} fayl
NODE_CONFIG_ENV=production (NODE_ENV=development): exit 0: {"port":4100,"host":"0.0.0.0"} faylHar qatorni o'qiymiz:
NODE_ENVyo'q:default+local→ port 4100 (localdan), hostdefaultdan.production:production.jsonhost'ni almashtirdi, portga tegmadi (unda port yo'q) — port baribirlocaldan 4100.PORT=5000: env eng kuchli — 5000.NODE_CONFIG_ENV—NODE_ENVdan ustun (pastda).
2.3 Biz kengroq sinadik: qaysi fayllar o'qildi
config.util.getConfigSources() — qaysi fayllar, qaysi tartibda yuklanganini aytadi. Biz production.json5 (JSON5 formatda), test.yaml (YAML) va log.daraja uchun LOG_LEVEL qo'shib sinadik (config 5.0.1, Node 24.21.0). Har rejimda ikki narsaga qarang: host va log.daraja qiymatlari hamda manbalar qatoridagi ikkinchi fayl:
== NODE_ENV yo'q
{"server":{"port":4100,"host":"127.0.0.1"},"saqlash":"xotira","log":{"daraja":"info"}}
manbalar: config/default.json → config/local.json → config/custom-environment-variables.json
== NODE_ENV=production
{"server":{"port":4100,"host":"0.0.0.0"},"saqlash":"fayl","log":{"daraja":"info"}}
manbalar: config/default.json → config/production.json5 → config/local.json → config/custom-environment-variables.json
== NODE_ENV=test
{"server":{"port":4100,"host":"127.0.0.1"},"saqlash":"xotira","log":{"daraja":"silent"}}
manbalar: config/default.json → config/test.yaml → config/local.json → config/custom-environment-variables.json
== production + PORT=5000 LOG_LEVEL=warn
{"server":{"port":5000,"host":"0.0.0.0"},"saqlash":"fayl","log":{"daraja":"warn"}}
manbalar: config/default.json → config/production.json5 → config/local.json → config/custom-environment-variables.jsonNima bo'ldi? manbalar qatorida faqat ikkinchi fayl almashdi: NODE_ENV qaysi bo'lsa, o'sha nomdagi fayl (production.json5 yoki test.yaml) o'qildi — format (JSON5, YAML) muhim emas. Port to'rt holatdan uchtasida 4100: uni local.json bosib turibdi. Faqat oxirgi holatda env (PORT=5000) uni yengdi.
flowchart LR
A[default.json] --> B["NODE_ENV fayli<br/>production.json5"]
B --> C[local.json]
C --> D["custom-environment-<br/>variables.json"]
D --> E["config obyekti<br/>(muzlatilgan)"]Diagrammadagi tartib — hujjatdagi to'liq ro'yxatning soddalashtirilgani. Hujjatda oraliq fayllar ham bor: default-{instance}, {hostname}, local-{deployment} va boshqalar. Ular kam ishlatiladi; kerak bo'lsa NODE_APP_INSTANCE va hostname bo'yicha qo'shimcha qatlamlar mumkin.
Tekshirib ko'ring:
local.jsonda port 4100. Serverda hamlocal.jsonbo'lsa nima bo'ladi?
Javob
U production.json dan keyin o'qiladi va uni bosadi — serverda port 4100 bo'lib qoladi (env berilmagan bo'lsa). Shuning uchun local.json git'ga kirmaydi (.gitignore ga config/local*) va faqat dasturchi kompyuterida yashaydi. Server qiymatlari env orqali keladi.
3. Chuqur birlashtirish (deep merge)
3.1 Model
node-config qatlamlarni chuqur birlashtiradi: ichma-ich obyektda faqat berilgan kalit almashadi. Oddiy { ...a, ...b } esa sayoz — nusxalash darsida ko'rgan farq. Brauzerda farqni ko'ramiz:
function chuqur(asos, ustki) {
const natija = { ...asos };
for (const [k, v] of Object.entries(ustki)) {
const ikkalasiObyekt = typeof v === "object" && v !== null &&
!Array.isArray(v) && typeof natija[k] === "object";
natija[k] = ikkalasiObyekt ? chuqur(natija[k], v) : v;
}
return natija;
}
const sukut = { server: { port: 3000, host: "127.0.0.1" },
cors: ["http://localhost:5173"] };
const prod = { server: { host: "0.0.0.0" },
cors: ["https://example.com"] };
console.log("sayoz:", { ...sukut, ...prod }.server);
console.log("chuqur:", chuqur(sukut, prod).server);
console.log("massiv:", chuqur(sukut, prod).cors);Konsolda:
sayoz: { host: '0.0.0.0' }
chuqur: { port: 3000, host: '0.0.0.0' }
massiv: [ 'https://example.com' ]Sayoz birlashtirishda server.port yo'qoldi — prod.server butun obyektni almashtirdi. Chuqurda — faqat host. Uchinchi qatorga qarang: massivlar birlashtirilmaydi, almashtiriladi. node-config ham massivni shunday qiladi — production.json dagi cors ro'yxati default.json dagini to'liq bosadi.
4. Env'ni ulash: custom-environment-variables.json
4.1 Xarita
Bu fayl qiymat emas, xarita: "config'ning shu yo'li — shu env o'zgaruvchisidan".
{
"server": {
"port": { "__name": "PORT", "__format": "number" }
},
"log": { "daraja": "LOG_LEVEL" }
}- Oddiy satr (
"LOG_LEVEL") — env qiymati satr sifatida. __name+__format— env qiymatini aylantirish:number,boolean,json,yamlva boshqalar.- Env o'zgaruvchisi yo'q bo'lsa — bu qatlam o'sha kalitga tegmaydi, oldingi qiymat qoladi.
4.2 Topilma: jim yo'qolgan maydon
Endi asosiy savol: env'da yaroqsiz qiymat bo'lsa nima bo'ladi? Kanon PORT=yuz bilan sinadi:
PORT=yuz (format number): exit 0: {"host":"127.0.0.1"} xotira has(yoq): falseexit 0 — ilova bemalol ishga tushdi. server obyektida esa port umuman yo'q: na 4100 (local), na 3000 (default). Xato yo'q, ogohlantirish yo'q. Number("yuz") — NaN, node-config uni "qiymat" sifatida qabul qilmadi va kalitni o'chirib yubordi.
Keyin kodda config.get("server.port") xato tashlaydi — lekin ishga tushishda emas, birinchi ishlatilgan joyda. Yomonroq holat: config.server.port ni to'g'ridan o'qisangiz — undefined, listen(undefined) esa tasodifiy port ochadi. env darsidagi PORT= tuzog'ining yana bir ko'rinishi.
Diqqat: node-config — yig'uvchi, tekshiruvchi emas. U "qaysi qiymat qayerdan" ni hal qiladi, lekin "qiymat to'g'rimi" ni so'ramaydi. Tekshiruvni alohida qo'shish kerak — keyingi darsda Zod bilan.
5. API: get, has va o'zgarmaslik
Kanon tajribasidan (har uch rejimda bir xil):
get(yoq) → Configuration property "yoq" is not defined
o'zgartirish → Error: Can not update runtime configuration property: "port". Configuration objects are| Usul | Kalit yo'q bo'lsa | Qachon |
|---|---|---|
config.get("a.b") |
xato tashlaydi | Majburiy sozlama |
config.has("a.b") |
false |
Ixtiyoriy xususiyatni tekshirish |
config.a.b |
undefined (jim) |
Ishlatmang |
get ning xato tashlashi — yaxshi: noto'g'ri yozilgan kalit (config.get("sever.port")) darhol ko'rinadi. To'g'ridan o'qish esa xatoni yashiradi.
O'zgarmaslik (immutability): birinchi get chaqiruvidan keyin config obyekti muzlatiladi. Ikkinchi qator — config.server.port = 1 ga urinish natijasi: "ishlash paytidagi sozlamani o'zgartirib bo'lmaydi". Bu ataylab: ilova o'rtasida kimdir sozlamani "vaqtincha" o'zgartirib, keyin qaytarishni unutsa — butun ilova boshqacha ishlaydi. Testda boshqa qiymat kerak bo'lsa — NODE_ENV=test va test.json, kodda o'zgartirish emas.
Tekshirib ko'ring: Nega
config.server.porto'rnigaconfig.get("server.port")tavsiya qilinadi?
Javob
get yo'q kalitda xato tashlaydi — sozlama unutilgan yoki noto'g'ri yozilgan bo'lsa, siz buni birinchi chaqiruvda bilasiz. To'g'ridan o'qish undefined beradi va xato boshqa joyda, boshqa ko'rinishda chiqadi (masalan, listen(undefined) — tasodifiy port).
6. NODE_ENV, NODE_CONFIG_ENV va strict mode
6.1 Ikki o'zgaruvchi
node-config qaysi muhit faylini o'qishni NODE_ENV dan oladi. Lekin env darsida ko'rdik: NODE_ENV ni kutubxonalar ham o'qiydi (Express, npm). Ba'zan ularni ajratish kerak: "kutubxonalar production rejimida ishlasin, lekin config staging.json dan olinsin".
Buning uchun NODE_CONFIG_ENV — u faqat node-config uchun va NODE_ENV dan ustun. Kanon tajribasining to'rtinchi qatori: NODE_ENV=development, NODE_CONFIG_ENV=production → host 0.0.0.0 (production fayli).
6.2 Biz topdik: xato yozilgan muhit nomi
NODE_ENV=prod (to'g'risi — production) bilan sinadik:
== NODE_ENV=prod (xato yozilgan)
{"server":{"port":4100,"host":"127.0.0.1"},"saqlash":"xotira","log":{"daraja":"info"}}
manbalar: config/default.json → config/local.json → config/custom-environment-variables.json
WARNING: NODE_ENV value of 'prod' did not match any deployment config file names.
WARNING: See https://github.com/node-config/node-config/wiki/Strict-ModeIlova ishga tushdi — development sozlamalari bilan (host 127.0.0.1, saqlash: xotira). Production serverda bu ma'lumot xotirada saqlanib, qayta ishga tushganda yo'qolishi demak. Faqat ogohlantirish chiqdi — u log ichida yo'qolib ketishi oson. Hujjatdagi "Strict Mode" sozlamasi (NODE_CONFIG_STRICT_MODE=1) bu ogohlantirishni xatoga aylantiradi — production'da yoqib qo'yishga arziydi.
6.3 Boshqa o'zgaruvchilar
| O'zgaruvchi | Vazifasi |
|---|---|
NODE_CONFIG_DIR |
config/ emas, boshqa papka |
NODE_CONFIG |
JSON satr — eng yuqori qatlam: NODE_CONFIG='{"server":{"port":5000}}' |
NODE_APP_INSTANCE |
Bir xil kodning bir nechta nusxasi uchun (default-1.json) |
SUPPRESS_NO_CONFIG_WARNING |
config/ umuman bo'lmasa ogohlantirmasin |
7. Formatlar
node-config ko'p formatni o'qiy oladi. Paketning parser.js faylidagi ro'yxat (5.0.1): js, cjs, mjs, ts, json, jsonc, json5, hjson, toml, coffee, yaml, yml, cson, properties, xml. Lekin hammasi "qutidan" emas:
| Format | Nima kerak | Biz sinadik |
|---|---|---|
| JSON | hech narsa | ha |
| JSON5 (izoh, oxirgi vergul) | json5 — config'ning o'z bog'liqligi |
ha (production.json5) |
| YAML | yaml yoki js-yaml paketini o'zingiz o'rnatasiz |
ha, yaml 2.9.1 bilan |
| JS/TS | JS — hech narsa; TS — hujjatga ko'ra TypeScript yuklovchi | yo'q |
JS formatining afzalligi — hisoblangan qiymatlar (port: Number(process.env.PORT) || 3000). Kamchiligi — config fayli endi kod: unda xato bo'lishi va sir yashirinishi mumkin. Formatlarning o'zi (YAML'ning no tuzog'i, TOML, INI) — keyingi darslardan birida.
config/default.json5 — izohli sozlama uchun yaxshi tanlov:
{
server: {
// Docker ichida 0.0.0.0 (33-qism)
host: "127.0.0.1",
port: 3000,
},
}8. Nega vazifalar-api ga kirmadi
Kanon qarori (QADAMLAR.md): node-config kirmadi — env + Zod yetarli (12-factor). Sabablar o'lchovdan:
| Mezon | node-config | env + Zod (kanon) |
|---|---|---|
| Sozlamalar soni | 150+ uchun qulay | 12 ta — tekis ro'yxat yetarli |
| Yaroqsiz qiymat | jim yo'qoladi (PORT=yuz) |
ishga tushmaydi, aniq xabar |
| Muhit nomi xato | ogohlantirish, dev sozlama | NODE_ENV enum — xato |
| Tiplar | get<T>() — ishonch bilan |
sxemadan avtomatik |
| Bog'liqlik | +2 paket (config, json5) |
Zod allaqachon bor |
Bu "node-config yomon" degani emas. U fayllar ierarxiyasini zo'r yechadi va ko'p yirik loyihalarda bor — begona repoda config/default.json ni ko'rsangiz, endi uni o'qiy olasiz. Faqat uni ishlatsangiz, ustiga tekshiruv qo'shing: config.util.toObject() ni olib, Zod sxemasidan o'tkazing.
9. API qadami: tajriba (holat 40, 2-qism)
Bu dars vazifalar-api ga kod qo'shmaydi — kanon qarori bo'yicha node-config kirmadi. Hali commit qilmang.
O'zingiz takrorlab ko'ring — loyihadan tashqarida, alohida papkada:
mkdir nc-tajriba && cd nc-tajriba
npm init -y
npm i --save-exact config@5.0.1
mkdir configconfig/ ga yuqoridagi to'rt faylni yozing va chiq.mjs:
import config from "config";
console.log(JSON.stringify(config.util.toObject()));Uch marta ishga tushiring: node chiq.mjs, NODE_ENV=production node chiq.mjs, PORT=yuz node chiq.mjs. Uchinchisida port qayerga ketganini o'z ko'zingiz bilan ko'ring.
10. Ko'p uchraydigan xatolar
| Belgi | Sabab | Davosi |
|---|---|---|
| Serverda port 4100 (lokal qiymat) | local.json serverga ham tushgan |
config/local* — .gitignore da |
| Production dev sozlamalar bilan ishladi | NODE_ENV=prod — fayl topilmadi |
NODE_CONFIG_STRICT_MODE=1 |
port yo'q, xato ham yo'q |
__format: "number", env yaroqsiz |
Ustiga sxema tekshiruvi |
cors ro'yxati birlashmadi |
Massivlar almashtiriladi | To'liq ro'yxatni har faylda yozing |
Can not update runtime configuration property |
Config muzlatilgan | Test uchun test.json |
| YAML fayl o'qilmadi | yaml/js-yaml o'rnatilmagan |
Paketni qo'shing yoki JSON5 |
11. Mashqlar
Yechimlar kurs/mashqlar/25/36-node-config/ da.
1-mashq (oson): natijani ayting
default.json: { "db": { "host": "localhost", "port": 5432 }, "kesh": true }. production.json: { "db": { "host": "db.ichki" }, "kesh": false }. custom-environment-variables.json: { "db": { "port": { "__name": "DB_PORT", "__format": "number" } } }. NODE_ENV=production DB_PORT=6432 bilan:
config.get("db.host")—config.get("db.port")—config.get("kesh")—config.has("db.parol")—
Yechim
- db.ichki — production fayli bosdi.
- 6432 — env eng yuqori qatlam,
numberformatida son. - false — production'da kesh o'chirilgan;
falseham to'liq qiymat. - false — kalit hech qaysi faylda yo'q;
getbo'lganda xato tashlardi.
2-mashq (o'rta): qatlamli yig'uvchi
Darsdagi chuqur funksiyasidan foydalanib yigma(qatlamlar) yozing: qatlamlar massivini chapdan o'ngga birlashtiradi va natijani chuqur muzlatadi (har ichki obyektga Object.freeze). Ichki qiymatni o'zgartirishga urinish qat'iy rejimda xato bersin.
Yechim
"use strict";
function chuqur(asos, ustki) {
const natija = { ...asos };
for (const [k, v] of Object.entries(ustki)) {
const ikkalasiObyekt = typeof v === "object" && v !== null &&
!Array.isArray(v) && typeof natija[k] === "object";
natija[k] = ikkalasiObyekt ? chuqur(natija[k], v) : v;
}
return natija;
}
function muzlat(o) {
for (const v of Object.values(o)) {
if (typeof v === "object" && v !== null) muzlat(v);
}
return Object.freeze(o);
}
function yigma(qatlamlar) {
return muzlat(qatlamlar.reduce((a, q) => chuqur(a, q), {}));
}
const c = yigma([
{ server: { port: 3000, host: "127.0.0.1" } },
{ server: { host: "0.0.0.0" } },
{ server: { port: 4100 } },
]);
console.log(c.server);
try {
c.server.port = 1;
} catch (x) {
console.log(x.constructor.name);
}
console.log(c.server.port);Konsolda:
{ port: 4100, host: '0.0.0.0' }
TypeError
4100Object.freeze faqat bitta darajani muzlatadi — shuning uchun muzlat rekursiv. "use strict" siz o'zgartirish jim e'tiborsiz qolardi (xato yo'q, qiymat ham o'zgarmaydi); qat'iy rejimda — TypeError. ESM modullari doim qat'iy rejimda.
3-mashq (qiyin): __format ni xavfsiz qiling
envniUla(xarita, env) yozing: custom-environment-variables.json shaklidagi xaritani oladi va obyekt qaytaradi. __format: "number" da qiymat butun son bo'lmasa — jim o'chirish o'rniga xatolar ro'yxatiga "server.port: PORT butun son emas" qo'shsin. Natija: { qiymat, xatolar }. Qiymatning o'zini xabarga qo'shmang.
Yechim
function envniUla(xarita, env, yol = []) {
const qiymat = {};
const xatolar = [];
for (const [k, v] of Object.entries(xarita)) {
const joy = [...yol, k];
if (typeof v === "string") {
if (env[v] !== undefined) qiymat[k] = env[v];
} else if ("__name" in v) {
const xom = env[v.__name];
if (xom === undefined) continue;
if (v.__format === "number") {
const son = Number(xom);
if (xom.trim() === "" || !Number.isInteger(son)) {
const nom = joy.join(".");
xatolar.push(`${nom}: ${v.__name} butun son emas`);
} else qiymat[k] = son;
} else qiymat[k] = xom;
} else {
const ichki = envniUla(v, env, joy);
if (Object.keys(ichki.qiymat).length) qiymat[k] = ichki.qiymat;
xatolar.push(...ichki.xatolar);
}
}
return { qiymat, xatolar };
}
const xarita = {
server: { port: { __name: "PORT", __format: "number" } },
log: { daraja: "LOG_LEVEL" },
};
console.log(JSON.stringify(envniUla(xarita, { PORT: "5000" })));
console.log(JSON.stringify(envniUla(xarita, { PORT: "yuz" })));
console.log(JSON.stringify(envniUla(xarita, { LOG_LEVEL: "warn" })));Konsolda:
{"qiymat":{"server":{"port":5000}},"xatolar":[]}
{"qiymat":{},"xatolar":["server.port: PORT butun son emas"]}
{"qiymat":{"log":{"daraja":"warn"}},"xatolar":[]}Ikkinchi qator — node-config'ning jim xulqidan farqi: kalit baribir qo'shilmadi, lekin endi xato bor. Ilova uni ko'rib, ishga tushishdan bosh tortadi.
4-mashq: API qadami
«API qadami» bo'limidagi tajribani loyihadan tashqarida bajaring. Uch rejim natijasini yozib qo'ying va o'zingizga javob bering: vazifalar-api ning 12 ta sozlamasi uchun node-config nima beradi va nima oladi? Commit yo'q — loyiha o'zgarmaydi.
Yechim
Natijalar «Kanon tajribasi» va «Topilma» bo'limlaridagidek bo'lishi kerak (port 4100 / host 0.0.0.0 / PORT=yuz da port yo'q). Javob: beradi — fayllar ierarxiyasi, get xatosi, muzlatish; oladi — +2 paket, jim yo'qolish, ikkinchi "haqiqat manbai" (fayl va env). 12 sozlama uchun env + sxema soddaroq — kanon qarori shu.
12. Real ishda
- Ko'p yillik Express loyihalarida
config/papkasi odatiy — ularni o'qish va o'zgartirish ishning bir qismi. - NestJS'ning
@nestjs/configmoduli ham shunga o'xshash g'oyani boshqa shaklda beradi (30-qism). - Strict mode va sxema tekshiruvi — mavjud loyihaga qo'shsangiz katta foyda beradigan ikki o'zgarish.
- Intervyu savollari: "Config fayllari qaysi tartibda birlashadi?", "
local.jsonnima uchun git'da yo'q?", "Config'ni ishlash paytida o'zgartirsa bo'ladimi?"
Xulosa
- node-config:
default→ muhit fayli →local→ env xaritasi; har qatlam chuqur birlashtiradi, massivlar almashtiriladi. custom-environment-variables.json— env → config yo'li;__formatbilan tur.config.get— yo'q kalitda xato (yaxshi); config muzlatilgan;NODE_CONFIG_ENV>NODE_ENV.- Tuzoqlar: yaroqsiz env qiymat jim yo'qoladi; muhit nomidagi xato faqat ogohlantirish (strict mode bilan xato).
vazifalar-apiga kirmadi: 12 sozlama uchun env + Zod soddaroq va qat'iyroq.
Keyingi dars: Env validatsiyasi va tipli config obyekti — src/config.ts: Zod bilan bitta sxema, muzlatilgan tipli obyekt va noto'g'ri sozlamada exit 78.
Manbalar
- node-config wiki — Configuration Files (fayllar tartibi), Environment Variables, Strict Mode: https://github.com/node-config/node-config/wiki
- npm —
config@5.0.1: https://www.npmjs.com/package/config - Kanon:
natijalar/tajriba/t36-config.txt(config 5.0.1: to'rt qatlam,NODE_CONFIG_ENV,get/o'zgartirish xatolari,PORT=yuzda jim yo'qolish),QADAMLAR.mdqarori. JSON5/YAML fayllari,getConfigSources,LOG_LEVELvaNODE_ENV=prodstrict mode ogohlantirishi — biz ishga tushirdik (config 5.0.1, yaml 2.9.1, Node 24.21.0, Windows 11).
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!