Usullar3 min read

HTTP modul

Axios keng qo'llaniladigan, boy funksiyali HTTP client paketi. Nest Axiosni o'rab, uni o'rnatilgan HttpModule orqali taqdim etadi. HttpModule HttpService sinfini eksport qiladi; u

Axios keng qo'llaniladigan, boy funksiyali HTTP client paketi. Nest Axiosni o'rab, uni o'rnatilgan HttpModule orqali taqdim etadi. HttpModule HttpService sinfini eksport qiladi; u Axiosga asoslangan metodlar orqali HTTP so'rovlarini bajarishga imkon beradi. Kutubxona shuningdek HTTP javoblarini Observables ga aylantiradi.

Hint

Istalgan umumiy maqsadli Node.js HTTP client kutubxonasini ham bevosita ishlatishingiz mumkin, jumladan got yoki undici.

O'rnatish

Ishlatishni boshlash uchun avval kerakli bog'liqliklarni o'rnating.

Terminal
1$ npm i --save @nestjs/axios axios

Boshlash

O'rnatish jarayoni tugagach, HttpService dan foydalanish uchun avval HttpModule ni import qiling.

TypeScript
1@Module({
2  imports: [HttpModule],
3  providers: [CatsService],
4})
5export class CatsModule {}

Keyin HttpService ni odatiy konstruktor in'eksiyasi orqali kiriting.

Hint

HttpModule va HttpService@nestjs/axios paketidan import qilinadi.

TypeScript
1@Injectable()
2export class CatsService {
3  constructor(private readonly httpService: HttpService) {}
4
5  findAll(): Observable<AxiosResponse<Cat[]>> {
6    return this.httpService.get('http://localhost:3000/cats');
7  }
8}
Hint

AxiosResponseaxios paketidan eksport qilinadigan interfeys ($ npm i axios).

Barcha HttpService metodlari Observable obyektiga o'ralgan AxiosResponse qaytaradi.

Konfiguratsiya

Axios HttpService xatti-harakatini moslashtirish uchun turli opsiyalar bilan sozlanishi mumkin. Batafsil bu yerda o'qing. Asosiy Axios instansiyasini sozlash uchun HttpModule ni import qilayotganda register() metodiga ixtiyoriy opsiyalar obyektini uzating. Ushbu opsiyalar obyektini bevosita Axios konstruktoriga uzatiladi.

TypeScript
1@Module({
2  imports: [
3    HttpModule.register({
4      timeout: 5000,
5      maxRedirects: 5,
6    }),
7  ],
8  providers: [CatsService],
9})
10export class CatsModule {}

Asinxron konfiguratsiya

Modul opsiyalarini statik emas, asinxron uzatish kerak bo'lsa, registerAsync() metodidan foydalaning. Ko'p dinamik modullarda bo'lgani kabi, Nest asinxron konfiguratsiya uchun bir nechta texnikani taqdim etadi.

Bitta texnika - factory funksiyasidan foydalanish:

TypeScript
1HttpModule.registerAsync({
2  useFactory: () => ({
3    timeout: 5000,
4    maxRedirects: 5,
5  }),
6});

Boshqa factory provayderlar kabi, factory funksiyamiz async bo'lishi mumkin va inject orqali bog'liqliklarni in'eksiya qilishi mumkin.

TypeScript
1HttpModule.registerAsync({
2  imports: [ConfigModule],
3  useFactory: async (configService: ConfigService) => ({
4    timeout: configService.get('HTTP_TIMEOUT'),
5    maxRedirects: configService.get('HTTP_MAX_REDIRECTS'),
6  }),
7  inject: [ConfigService],
8});

Muqobil ravishda, quyida ko'rsatilgandek HttpModule ni factory o'rniga sinf orqali sozlashingiz mumkin.

TypeScript
1HttpModule.registerAsync({
2  useClass: HttpConfigService,
3});

Yuqoridagi konstruktsiya HttpConfigService ni HttpModule ichida instansiyalaydi va undan opsiyalar obyektini yaratish uchun foydalanadi. Bu misolda HttpConfigService quyida ko'rsatilganidek HttpModuleOptionsFactory interfeysini amalga oshirishi shart. HttpModule taqdim etilgan sinf instansiyasida createHttpOptions() metodini chaqiradi.

TypeScript
1@Injectable()
2class HttpConfigService implements HttpModuleOptionsFactory {
3  createHttpOptions(): HttpModuleOptions {
4    return {
5      timeout: 5000,
6      maxRedirects: 5,
7    };
8  }
9}

Agar HttpModule ichida shaxsiy nusxa yaratish o'rniga mavjud opsiyalar provayderini qayta ishlatmoqchi bo'lsangiz, useExisting sintaksisini ishlating.

TypeScript
1HttpModule.registerAsync({
2  imports: [ConfigModule],
3  useExisting: HttpConfigService,
4});

Shuningdek, registerAsync() metodiga extraProviders deb ataladigan provayderlarni uzatishingiz mumkin. Bu provayderlar modul provayderlariga qo'shib yuboriladi.

TypeScript
1HttpModule.registerAsync({
2  imports: [ConfigModule],
3  useClass: HttpConfigService,
4  extraProviders: [MyAdditionalProvider],
5});

Bu factory funksiyasi yoki sinf konstruktori uchun qo'shimcha bog'liqliklarni taqdim etmoqchi bo'lganingizda foydali.

Axios'ni bevosita ishlatish

Agar HttpModule.register opsiyalari sizga yetarli bo'lmasa yoki @nestjs/axios yaratgan asosiy Axios instansiyasiga bevosita kirishni xohlasangiz, HttpService#axiosRef orqali kirishingiz mumkin, quyidagicha:

TypeScript
1@Injectable()
2export class CatsService {
3  constructor(private readonly httpService: HttpService) {}
4
5  findAll(): Promise<AxiosResponse<Cat[]>> {
6    return this.httpService.axiosRef.get('http://localhost:3000/cats');
7    //                      ^ AxiosInstance interface
8  }
9}

To'liq misol

HttpService metodlarining qaytadigan qiymati Observable bo'lgani sababli, so'rov ma'lumotini promise ko'rinishida olish uchun rxjs - firstValueFrom yoki lastValueFrom dan foydalanishimiz mumkin.

TypeScript
1import { catchError, firstValueFrom } from 'rxjs';
2
3@Injectable()
4export class CatsService {
5  private readonly logger = new Logger(CatsService.name);
6  constructor(private readonly httpService: HttpService) {}
7
8  async findAll(): Promise<Cat[]> {
9    const { data } = await firstValueFrom(
10      this.httpService.get<Cat[]>('http://localhost:3000/cats').pipe(
11        catchError((error: AxiosError) => {
12          this.logger.error(error.response.data);
13          throw 'An error happened!';
14        }),
15      ),
16    );
17    return data;
18  }
19}
Hint

firstValueFrom va lastValueFrom o'rtasidagi farqlar uchun RxJS hujjatlaridagi firstValueFrom va lastValueFrom bo'limlariga qarang.