Categorias
iiiiii
Crear un provider custom
Descripcion
crear un custom provider
Nota1
0. En nest se debe crear un modulo para guardar esta clase adaptadora y poder exportarla
1. creamos una insterface
2. creamos la clase adaptadora usando axius y usar el decorador @Injectable()
3. Se exporta en el modulo donde se creo esa clase adaptadora
4. cambiamos donde se use axios (SeedService) por la clase adaptadora
Modulo
a
Servicio
import { Injectable } from '@nestjs/common';
//import axios, { AxiosInstance } from 'axios';
import { PokemonResponse } from './interfaces/poke-interface.interface';
import { PokemonService } from '../pokemon/pokemon.service';
import { Pokemon } from 'src/pokemon/entities/pokemon.entity';
import { Model } from 'mongoose';
import { InjectModel } from '@nestjs/mongoose/dist/common';
import { AxiusAdapter } from '../common/adapters/axius.adapter';
@Injectable()
export class SeedService {
constructor(
@InjectModel(Pokemon.name)
private readonly PokemonModel:Model<Pokemon>,
private readonly httpAdapter:AxiusAdapter //Aqui se implementa la clase para no usar directamente Axius
){
}
//private readonly axios:AxiosInstance = axios; //Se quita esto para usar la clase adaptadora.
async executeSeed(){
//const {data} = await this.axios.get<PokemonResponse>('https://pokeapi.co/api/v2/pokemon?limit=100');
//Aqui ya se usa mi httpAdapter y se usa en vez de axius
const data = await this.httpAdapter.get<PokemonResponse>('https://pokeapi.co/api/v2/pokemon?limit=100');
//console.log(data);
await this.PokemonModel.deleteMany();
let pokemonInsert:{name:string,no:number}[]=[];
data.results.forEach(async({name,url}) => {
const segm = url.split('/');
const no:number = +segm[segm.length-2];
const newPokemon = {name,no};
pokemonInsert.push(newPokemon);
});
await this.PokemonModel.insertMany(pokemonInsert);
return 'Todo ok';
}
}
Controlador
import { HttpAdapter } from '../interfaces/http-adapte-interf';
import axios, { AxiosInstance } from 'axios';
import { Injectable } from '@nestjs/common';
@Injectable() //Para que sea inyectado en cualquier contructor
export class AxiusAdapter implements HttpAdapter{
private axios:AxiosInstance = axios;
async get<T>(url:string):Promise<T>{
try {
const {data} = await this.axios.get<T>(url);
return data;
} catch (error) {
throw new Error('This is as error check logs');
}
}
}
Entity
//Se crea una interface para decirle a la clase adaptadora que obligue a que tenga este medoto
export interface HttpAdapter{
get<T>(url:string):Promise<T>;
}
App.module
import { Module } from '@nestjs/common';
import { AxiusAdapter } from './adapters/axius.adapter'; //exportamos ese adapador nuevo creado
@Module({
providers:[
AxiusAdapter
],
exports:[
AxiusAdapter
]
})
export class CommonModule {}
Main
a
Vista
a