A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

useFactory

7/17
Recursos
// src/app.module.ts
import { Module, HttpModule, HttpService } from '@nestjs/common';  // 馃憟 imports

@Module({
  imports: [HttpModule, UsersModule, ProductsModule],
  controllers: [AppController],
  providers: [
    imports: [HttpModule, UsersModule, ProductsModule], // 馃憟 add HttpModule
    ...,
    {
      provide: 'TASKS',
      useFactory: async (http: HttpService) => { // 馃憟 implement useFactory
        const tasks = await http
          .get('https://jsonplaceholder.typicode.com/todos')
          .toPromise();
        return tasks.data;
      },
      inject: [HttpService],
    },
  ],
})
export class AppModule {}
// src/app.service.ts
  
import { Injectable, Inject } from '@nestjs/common';

@Injectable()
export class AppService {
  constructor(
    @Inject('API_KEY') private apiKey: string,
    @Inject('TASKS') private tasks: any[], // 馃憟 inject TASKS
  ) {}
  getHello(): string {
    console.log(this.tasks); // 馃憟 print TASKS
    return `Hello World! ${this.apiKey}`;
  }
}

Aportes 15

Preguntas 3

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Resumen

httpService

httpService nos permite hacer peticiones HTTP (get, post, put, delete, 鈥). Esta libreria se basa en Axios (axios es una libreria de javascript para hacer peticiones http).

Uso de http

Para usar httpService debemos hacer 2 cosas

  1. Declarar el modulo HttpModule dentro del modulo que usar el servicio
import { HttpModule } from '@nestjs/common';  // 馃憟 imports
...
@Module({
	imports: [HttpModule, ...], // 馃憟 
})
  1. Inyectar el servicio en los providers del modulo que usara el servicio
import { HttpService } from '@nestjs/common';  // 馃憟 imports
...
@Injectable()
export class NameClass{
  constructor(private httpService: HttpService) {} // 馃憟 inyeccion
	...
}

// Listo, ahora podremos usar el modulo
 nameOfFunction(): Observable<AxiosResponse<EntitiName[]>> {
    return this.httpService.get('url');
 }

Introducci贸n

Use factory permite crear valores din谩micamente. El valor real del provider ( sean valores, objetos, clases) ser谩 proporcionado por lo que se devuelva en una funci贸n fabricadora, aun si el valor se obtenga de forma as铆ncrona. La funci贸n fabricadora puede recibir par谩metros.

Creacion del provider

// src/app.module.ts
import { Module, HttpModule, HttpService } from '@nestjs/common';  // 馃憟 imports

@Module({
  imports: [HttpModule, UsersModule, ProductsModule],
  controllers: [AppController],
  providers: [
    imports: [HttpModule, UsersModule, ProductsModule], // 馃憟 Se vuelven a importar los modul
    ...,
    {
      provide: 'TASKS',
      useFactory: async (http: HttpService) => { // 馃憟 implement useFactory
        const tasks = await http
          .get('https://jsonplaceholder.typicode.com/todos')
          .toPromise();
        return tasks.data;
      },
      inject: [HttpService], // Se inyecta los servicios que usara la funcion fabricadora
    },
  ],
})
export class AppModule {}

Uso del provider

// src/app.service.ts
  
import { Injectable, Inject } from '@nestjs/common';

@Injectable()
export class AppService {
  constructor(
    @Inject('API_KEY') private apiKey: string,
    @Inject('TASKS') private tasks: any[], // 馃憟 inject TASKS
  ) {}
  getHello(): string {
    console.log(this.tasks); // 馃憟 print TASKS
    return `Hello World! ${this.apiKey}`;
  }
}

El HttpModule de 鈥淍nestjs/common鈥 ya no sera soportado en las siguientes versiones, tiene que utilizar 鈥淍nestjs/axios鈥 y funciona exactamente igual.

The HttpModule exported from the @nestjs/common package has been deprecated and will be removed in the next major release. Instead, please use the @nestjs/axios package

Yo estoy usando la v8 de nest y estan deprecadas las que se estan utilizando ahora es utilizar firstValueFrom o lastValueFrom 馃槂

    {
      provide: 'TASKS',
      useFactory: async (http: HttpService) => {
        const tasks = await http.get(
          'https://jsonplaceholder.typicode.com/todos',
        );

        const data = await (await firstValueFrom(tasks)).data;

        return data;
      },
      inject: [HttpService],
    }

El m茅todo httpService tambi茅n se puede usar con observables para aprovechar las ventajas de RxJs.
https://docs.nestjs.com/techniques/http-module#http-module

Se recomienda no usar Use Factory para llamar a APIs porque dependerias de esta esperando a que responda AWAIT. Solo se llamo a API por cuestiones de aprendizaje. Se puede hacer el llamado por medio del HTTP Module. Si usar Use Factory para BD como Mongo DB

Ahora me parece que se usa algo diferente por algunas cosas que est谩n deprecated. Siguiendo los warnings del editor me qued茅 con algo as铆, espero les sirva 馃槃

Por cierto, hay que instalar esta otra librer铆a:

yarn add @nestjs/axios
import { HttpModule, HttpService } from '@nestjs/axios';
import { Module } from '@nestjs/common';
import { firstValueFrom } from 'rxjs';

@Module({
  imports: [HttpModule],
  providers: [{
    provide: 'TASKS',
    useFactory: async (http: HttpService) => {
      const response = http.get('https://jsonplaceholder.typicode.com/todos');
      const tasks = await firstValueFrom(response);
      return tasks.data;
    },
    inject: [HttpService],
  }],
})

Para que el c贸digo funcione como el profesor nos muestra, el m茅todo 鈥榯oPromise()鈥 est谩 obsoleto, por lo que hay que instalar la dependencia rxjs

npm i rxjs

luego, el response de tipo 鈥淥bservable鈥 instanciado en la variable 鈥渢asks鈥 se transforma en una promesa con el m茅todo 鈥渇irstValueFrom()鈥, y pueden resolver la promesa como mejor les plazca, para continuar r谩pidamente instanci茅 un Promise.resolve() as铆

import { Module } from '@nestjs/common';
import { HttpModule, HttpService } from '@nestjs/axios';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ProductsModule } from './products/products.module';
import { UserModule } from './user/user.module';
import { firstValueFrom } from 'rxjs';

@Module({
  imports: [
    ProductsModule,
    UserModule,
    HttpModule.registerAsync({
      useFactory: () => ({
        timeout: 1000,
        maxRedirects: 5,
      }),
    }),
  ],
  controllers: [AppController],
  providers: [
    AppService,
    {
      provide: 'TASKS',
      inject: [HttpService],
      useFactory: async (http: HttpService) => {
        const tasks = await http.get(
          'https://jsonplaceholder.typicode.com/todos',
        );
        const value = Promise.resolve(firstValueFrom(tasks));
        return value;
      },
    },
  ],
})
export class AppModule {}

Espero de algo sirva!

Soy el 煤nico al que le pone nervioso que el profe no use auto format, de verdad es tan f谩cil.

Por si le interesa a alguno

Actualmente es depreciado el HttpModule o HttpService鈥.
Para solucionarlo hay que instalar la siguiente dependecia:

npm i --save @nestjs/axios

Importando

import { HttpModule, HttpService } from '@nestjs/axios';

A 21 de Octubre HttpModule est谩 depreciado si lo importas desde @nestjs/common, las recomendaciones indican importarlo mediante @nestjs/axios

Cuando trabajo directamente con express creo algunos micro-servicios, estos se comunican por medio de apis de ese micro-servicio. 驴C贸mo traslado ese concepto a Nest?..

Request a otra API. Nuestro servicio hace un request a otro servicio por ejemplo la data de una otra API

Use Factory es una fabrica de provider para resolver algo asincrona y recibiendo una injeccion

Crack!