Soy nuevo en el mundo de NEST.js y trato de crear middleware simple. Primero, creé un middleware con este comando:

nest g middleware common/middleware/logging

Y después de agregar mi código

import { Injectable, NestMiddleware } from '@nestjs/common';

@Injectable()
export class LoggingMiddleware implements NestMiddleware {
  use(req: any, res: any, next: () => void) {
    console.time('Request-response time');
    console.log('Hi from middleware!');

    res.on('finish', () => console.timeEnd('Request-response time'));
    next();
  }
}

Y finalmente, agrego el middleware

import { Module, MiddlewareConsumer } from '@nestjs/common';
import { APP_GUARD } from '@nestjs/core';
import { ApiKeyGuard } from './guards/api-key.guard';
import { ConfigModule } from '@nestjs/config';
import { LoggingMiddleware } from './middleware/logging.middleware';

@Module({
  imports: [
    ConfigModule
  ],
  providers: [
    {
      provide: APP_GUARD,
      useClass: ApiKeyGuard
    }

  ]
})
export class CommonModule {
  constructor(consumer: MiddlewareConsumer) {
    consumer.apply(LoggingMiddleware).forRoutes('*')
  }
}

Pero cuando trato de ejecutarlo:

Nest no puede resolver las dependencias del CommonModule (?). Asegúrese de que el argumento Objeto en el índice [0] esté disponible en el contexto CommonModule.

Posibles soluciones:

  • Si Object es un proveedor, ¿forma parte del CommonModule actual?
  • Si Object se exporta desde un @Module separado, ¿ese módulo se importa dentro de CommonModule? @Módulo({ importaciones: [/ * el módulo que contiene el objeto * /]}) + 2ms Error: Nest no puede resolver las dependencias del CommonModule (?). Por favor haz asegúrese de que el argumento Objeto en el índice [0] esté disponible en el Contexto CommonModule.

Posibles soluciones:

  • Si Object es un proveedor, ¿forma parte del CommonModule actual?
  • Si Object se exporta desde un @Module separado, ¿ese módulo se importa dentro de CommonModule? @Módulo({ importaciones: [/ * el módulo que contiene el objeto * /]})

¿Me puedes ayudar?

0
Daniel ORTIZ 25 ago. 2020 a las 15:56

1 respuesta

La mejor respuesta

El MiddlewareConsumer no es parte del constructor. Más bien, su clase de módulo debe implementar NestModule y debe tener un método configure que tome consumer: MiddlewareConsumer como el primer y único parámetro.

@Module({
  imports: [
    ConfigModule
  ],
  providers: [
    {
      provide: APP_GUARD,
      useClass: ApiKeyGuard
    }

  ]
})
export class CommonModule implmenets NestModule {
  configure(consumer: MidlewareConsumer) {
    consumer.apply(LoggingMiddleware).forRoutes('*')
  }
}
1
Jay McDoniel 25 ago. 2020 a las 16:06