NestJS 中间件未执行

NestJS Middleware Not Executed

从模块连接时,NestJS class 或功能中间件不会 运行。它也不适用于单个路径、控制器或每条路径。从 main.ts 连接功能中间件工作正常。

//main.ts
import { ValidationPipe } from '@nestjs/common'
import { NestFactory } from '@nestjs/core'
import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify'
import { AppModule } from './app.module'

declare const module: any

async function bootstrap() {
  const app = await NestFactory.create<NestFastifyApplication>(AppModule, new FastifyAdapter())

  app.useGlobalPipes(new ValidationPipe())

  await app.listen(2100)

  if (module.hot) {
    module.hot.accept()
    module.hot.dispose(() => app.close())
  }
}
bootstrap()
//app.module.ts
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common'
import { AuthMiddleware } from './middleware/auth.middleware'
import { UserModule } from './user/user.module'

@Module({
  imports: [UserModule],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(AuthMiddleware)
      .forRoutes('(.*)')
  }
}
//auth.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common'
import { FastifyRequest, FastifyReply } from 'fastify'

@Injectable()
export class AuthMiddleware implements NestMiddleware {
  use(req: FastifyRequest, res: FastifyReply, next: () => void) {
    console.log('test auth middleware')
    next()
  }
}

预期输出:测试身份验证中间件
实际:无

问题是安装“fastify”包和“@nestjs/platform-fastify”。此外,如果你删除“fastify”包,那么“@nestjs/platform-fastify”包中使用的依赖项也会被删除,因此它不会正常工作。如果您已经安装了这两个软件包,请卸载“fastify”并重新安装“@nestjs/platform-fastify”。

我没有使用 Fastify,但我的中间件甚至没有执行,甚至直接从文档中获取。我构建了我的项目 (npm run build),然后返回到开发模式 npm run start:dev,这似乎可行。如有疑问,请调查 /dist 目录。

我也遇到了同样的问题。使用显式控制器时工作正常,但不适用于“*”。 也试过:

forRoutes({path: '*', method: RequestMethod.ALL })

但这似乎也不起作用。 不幸的是,我的解决方案是使用全局功能中间件,如示例 here 所示。 这不是很容易维护,因为它是在 main.ts 而不是 app.module 中定义的。 这导致了 e2e 测试的一些问题,但我最终能够让它工作。只需确保在 main.ts 中以及在为 e2e 测试创建测试模块时使用中间件。

main.ts:

const app = await NestFactory.create(AppModule);
app.use(functionalMiddleware);

在您的端到端测试模块中:

const createAppE2e = async (): Promise<INestApplication> => {
   const moduleRef = await Test.createTestingModule({
     imports: [AppModule],
   });
   const app = moduleRef.createNestApplication();
   app.use(functionalMiddleware);
   await app.init();
   return app;
}

就我而言,我想在全局应用一个中间件,在特定模块级别应用一个中间件。 但是出于某种原因,当您在特定模块级别应用中间件时,中间件不起作用。

export class PartnerModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(ModuleSpecificMiddleware);
  }
}

所以我找到了另一种方法。在应用程序模块中,您可以像这样分配它。

export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(AuthMiddleware);
    consumer.apply(ModuleSpecificMiddleware).forRoutes(PartnerController); // This was the solution
  }
}