Saltar al contenido

Inyectar servicio en guard en Nest.JS

este problema se puede solucionar de variadas formas, pero te damos la que en nuestra opinión es la resolución más completa.

Solución:

Para inyectar servicio en guardia. Puede crear un módulo global.

// ApiModule
import Module,Global from '@nestjs/common';
import KeyService from '../';

@Global()
@Module(
    providers: [ KeyService ],
    exports: [KeyService]
)
export class ApiModule 

Luego inyecta servicio en guardia como este

// guard
export class ApiGuard implements CanActivate 
constructor(@Inject('KeyService') private readonly KeyService) 

 async canActivate(context: ExecutionContext) 
    // your code
    throw new ForbiddenException();
  

Ahora el problema se puede resolver. Pero tengo otro problema. Quiero inyectar algo en el servicio pero recibí este error:

Nest no puede resolver las dependencias de AuthGuard (?, +). Por favor, asegúrese de que el argumento en el índice [0] está disponible en el contexto actual.

Y aquí está mi solución:

Para inyectar otra dependencia en KeyService, como dicen los documentos de nestjs.

Los guardias globales registrados desde fuera de cualquier módulo (con useGlobalGuards() como en el ejemplo anterior) no pueden inyectar dependencias ya que esto se hace fuera del contexto de cualquier módulo.

Esta es su muestra:

// app.module.js
import  Module  from '@nestjs/common';
import  APP_GUARD  from '@nestjs/core';

@Module(
  providers: [
    
      provide: APP_GUARD,
      useClass: RolesGuard,
    ,
  ],
)
export class ApplicationModule 

Funcionó. Ahora puedo usar guard global sin error de dependencia.

Tal vez sea demasiado tarde, pero encontré el mismo problema y encontré una solución. Tal vez hay uno mejor, pero está funcionando correctamente para mí:

Defina KeysModule como un módulo global, puede verificar cómo hacerlo en los documentos de nestjs: https://docs.nestjs.com/modules

Después puedes hacer esto:

import  CanActivate, ExecutionContext, Injectable  from '@nestjs/common';

@Injectable()
export class ApiGuard implements CanActivate 

constructor(
@Inject('KeyService')
private readonly ks
) 

const key = await this.ks.findKey();

"YOUR_CODE_HERE..."


Espero que sea de ayuda para ti o para alguien que se quede con esto en el futuro.

Aquí tienes las reseñas y calificaciones

Si entiendes que te ha sido de utilidad nuestro post, nos gustaría que lo compartas con otros desarrolladores y nos ayudes a difundir nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *