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
Serian los mismos pasos que realizo el profesor pero habiendo instalado antes la dependencia
npm i --save @nestjs/axios
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{}
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(awaitfirstValueFrom(tasks)).data;return data;},inject:[HttpService],}
El método httpService también se puede usar con observables para aprovechar las ventajas de RxJs.
Me gustan más los observables <3
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!
Gracias!
gracias.
Hola, si a alguien le da el error "unexpected end of file", a mi me funcionó esta configuración
muchas gracias, me habia estancado dos dias por ese error
Gracias por el aporte! me faltaban los headers de la petició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 😄
gracias, estaba enloquecido tratando de hacer la adaptación
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
El .toPromise() esta deprecado y va a desaparecer ellos recomienda usar firstValueFrom de rxjs
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
Gracias por compartir así tan ordenado
Me parece muy genial que hayan actualizado la clase para que funcione con las versiones mas recientes de nestje
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
Nos podrás mostrar el código o enviarnos el repo a ver si te podemos ayudar?
Usar un fetch normal no es más práctico?
{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
Mi solución al error de "unexpected end of file".
Ya al día de hoy no me funcionaba con ninguno de los aportes que habían.