Retseptlar3 min read

Read-Eval-Print-Loop (REPL)

REPL - bu foydalanuvchi kiritgan buyruqlarni qabul qiladigan, ularni bajaradigan va natijani qaytaradigan sodda interaktiv muhit. REPL imkoniyati dependency graph'ingizni tekshiris

REPL - bu foydalanuvchi kiritgan buyruqlarni qabul qiladigan, ularni bajaradigan va natijani qaytaradigan sodda interaktiv muhit. REPL imkoniyati dependency graph'ingizni tekshirish va provider'lar (hamda controller'lar) metodlarini to'g'ridan-to'g'ri terminaldan chaqirishga imkon beradi.

Foydalanish

NestJS ilovangizni REPL rejimida ishga tushirish uchun yangi repl.ts faylini (main.ts bilan birga) yarating va unga quyidagi kodni yozing:

TypeScript
repl
1import { repl } from '@nestjs/core';
2import { AppModule } from './src/app.module';
3
4async function bootstrap() {
5  await repl(AppModule);
6}
7bootstrap();

Endi terminalda REPL'ni quyidagi buyruq bilan ishga tushiring:

Terminal
1$ npm run start -- --entryFile repl
Hint

repl Node.js REPL server obyektini qaytaradi.

Ishga tushgach, konsolda quyidagi xabarlarni ko'rishingiz kerak:

Terminal
1LOG [NestFactory] Starting Nest application...
2LOG [InstanceLoader] AppModule dependencies initialized
3LOG REPL initialized

Shundan so'ng dependency graph bilan ishlashni boshlashingiz mumkin. Masalan, AppService ni olib (bu yerda starter project misol sifatida ishlatilgan) getHello() metodini chaqirishingiz mumkin:

TypeScript
1> get(AppService).getHello()
2'Hello World!'

Terminal ichidan istalgan JavaScript kodini bajarishingiz mumkin. Masalan, AppController instansiyasini lokal o'zgaruvchiga yozib, asinxron metodni await bilan chaqirishingiz mumkin:

TypeScript
1> appController = get(AppController)
2AppController { appService: AppService {} }
3> await appController.getHello()
4'Hello World!'

Berilgan provider yoki controller'dagi barcha public metodlarni ko'rsatish uchun methods() funksiyasidan foydalaning:

TypeScript
1> methods(AppController)
2
3Methods:
4 ◻ getHello

Barcha ro'yxatdan o'tgan modullarni controller va provider'lari bilan birga ro'yxat ko'rinishida chiqarish uchun debug() dan foydalaning.

TypeScript
1> debug()
2
3AppModule:
4 - controllers:
5  ◻ AppController
6 - providers:
7  ◻ AppService

Qisqa demo:

Oldindan taqdim etilgan native metodlar haqida ko'proq ma'lumotni quyidagi bo'limdan topasiz.

Native funksiyalar

O'rnatilgan NestJS REPL bir nechta native funksiyalar bilan keladi va ular REPL ishga tushganda global mavjud bo'ladi. Ularni ro'yxatlash uchun help() ni chaqiring.

Agar biror funksiya signature'ini (ya'ni qabul qiladigan parametrlar va qaytish turini) eslay olmasangiz, <function_name>.help ni chaqirishingiz mumkin. Masalan:

Plain text
1> $.help
2Retrieves an instance of either injectable or controller, otherwise, throws exception.
3Interface: $(token: InjectionToken) => any
Hint

Bu funksiya interfeyslari TypeScript function type expression syntax da yozilgan.

FunctionDescriptionSignature
debugBarcha ro'yxatdan o'tgan modullarni controller va provider'lari bilan ro'yxat ko'rinishida chiqaradi.debug(moduleCls?: ClassRef | string) => void
get or $Injectable yoki controller instansiyasini oladi, aks holda exception tashlaydi.get(token: InjectionToken) => any
methodsBerilgan provider yoki controller'dagi barcha public metodlarni ko'rsatadi.methods(token: ClassRef | string) => void
resolveTransient yoki request-scoped injectable/controller instansiyasini resolve qiladi, aks holda exception tashlaydi.resolve(token: InjectionToken, contextId: any) => Promise<any>
selectModullar daraxti bo'ylab yurishga imkon beradi, masalan tanlangan moduldan muayyan instansiyani olish uchun.select(token: DynamicModule | ClassRef) => INestApplicationContext

Watch mode

Development vaqtida koddagi barcha o'zgarishlar avtomatik aks etishi uchun REPL'ni watch mode'da ishga tushirish foydali:

Terminal
1$ npm run start -- --watch --entryFile repl

Bunda bitta kamchilik bor: har bir reload'dan keyin REPL buyruqlar tarixi yo'qoladi va bu noqulay bo'lishi mumkin. Yaxshiyamki, buning juda sodda yechimi bor. bootstrap funksiyasini quyidagicha o'zgartiring:

TypeScript
1async function bootstrap() {
2  const replServer = await repl(AppModule);
3  replServer.setupHistory(".nestjs_repl_history", (err) => {
4    if (err) {
5      console.error(err);
6    }
7  });
8}

Endi tarix ishga tushirishlar va reload'lar orasida saqlanadi.