NestJS permite inyecciones de servicios o datos que necesiten de alguna petición HTTP o algún proceso asíncrono.
Inyecciones Asíncronas
El tipo de inyección useFactory permite que realices un proceso asíncrono para inyectar un servicio o datos provenientes de una API.
A partir de NestJS v8, el servicio HttpService importado desde @nestjs/common fue deprecado. Instala la dependencia @nestjs/axios e impórtalo desde ahí. No deberás realizar ningún otro cambio en tu código. También debes asegurarte de importar el módulo HttpModule desde la misma dependencia.
La propiedad inject permite que inyectes (valga la redundancia) dentro de esta función asíncrona del useFactory otros servicios que este pueda necesitar. En el ejemplo anterior, se está haciendo una llamada a un request para obtener datos.
Importa estos datos en el controlador que lo necesite de la siguiente manera.
Así podrás hacer uso de estos datos que fueron cargados de forma asíncrona.
Ten en cuenta que, al realizar una solicitud asíncrona, el controlador dependerá de la finalización de este proceso para estar disponible, pudiendo retrasar el inicio de tu aplicación. Esta funcionalidad suele utilizarse para conexiones de base de datos o procesos asíncronos similares.
Cuadro de código para inyección de servicios useFactory
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
Actualmente veo que se sigue ocupando bastante, principalmente para los e2e tests, pero axios me sigue pareciendo la mejor opción debido a su facilidad de uso.
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
Declarar el modulo HttpModule dentro del modulo que usar el servicio
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.tsimport{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 useFactoryconst tasks =await http
.get('https://jsonplaceholder.typicode.com/todos').toPromise();return tasks.data;},inject:[HttpService],// Se inyecta los servicios que usara la funcion fabricadora},],})exportclassAppModule{}
En mi caso necesito en una aplicación de NestJS + Apollo GraphQL Express, consultar con introspección las queries y mutations para tener sus nombres disponibles y exponerlas en Prometheus como métricas, el problema es que con la factoría aún no tengo acceso porque tanto el módulo como el main.ts no se han resuelto ni se ha creado la API de GraphQL, aunque entendía que al ser asíncrono estaría a la espera de dicha información.
Como podria tener acceso a los nombres de las queries y mutations de GraphQL para este fin? Gracias
{provide:'TASK',useFactory:async(http:HttpService)=>{const tasks =await http.get('https://jsonplaceholder.typicode.com/todos');returnnewPromise((resolve)=>{ tasks.subscribe((response)=>{resolve(response.data);});});},``` Por si no quieren usar rxjs
Qué bueno que hicieron esta clase mostrando ambas versiones de Nest.js
Es difícil estar llevar a cabo cursos actualizados con el avance de la tecnología tan rápido, se agradece el esfuerzo :D
No necesariamente, las APIs ( interfaces de servicio) pueden ser consumidas desde cualquier lugar
Para que el código funcione como el profesor nos muestra, el método 'toPromise()' está obsoleto, por lo que hay que instalar la dependencia rxjs
npm i rxjs
luego, el response de tipo "Observable" instanciado en la variable "tasks" se transforma en una promesa con el método "firstValueFrom()", 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;},},],})exportclassAppModule{}
Espero de algo sirva!
Hola, si a alguien le da el error "unexpected end of file", a mi me funcionó esta configuración
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 😄