typescript NestJS中间件未执行

3lxsmp7m  于 2023-03-13  发布在  TypeScript
关注(0)|答案(5)|浏览(147)

NestJS类或功能中间件在从模块连接时不运行。它也不适用于单个路径、控制器或每个路径。从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()
  }
}

预期产出:测试认证中间件
实际:无

epggiuax

epggiuax1#

问题是“fastify”软件包与“@nestjs/platform-fastify”一起安装。另外,如果您删除“fastify”软件包,则“@nestjs/platform-fastify”软件包中使用的依赖项也将被删除,因此它将无法正常工作。如果您同时安装了两个软件包,请卸载“fastify”并重新安装“@nestjs/platform-fastify”。

7qhs6swi

7qhs6swi2#

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

1cosmwyk

1cosmwyk3#

我也有同样的问题。使用显式控制器时工作正常,但使用“*”时就不行了。还尝试过:

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

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

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

在e2e测试模块中:

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

fnatzsnv4#

在我的例子中,我想在全局应用一个中间件,在特定的模块级别应用一个中间件,但是由于某种原因,当您在特定的模块级别应用中间件时,中间件不工作。

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
  }
}
jtw3ybtb

jtw3ybtb5#

对我有效的是:我在前面定义了路由,如下所示,在路由的末尾有一个/

@Controller('v1/partnerPortal/')
export class SubscriptionController {
  constructor()
}

我删除了斜线,它现在为我工作

@Controller('v1/partnerPortal')
export class SubscriptionController {
  constructor()
}

我的模块代码:

export class SubscriptionModule {
  configure(consumer: MiddlewareConsumer): void {
    consumer.apply(KeyAuthMiddlewareService).forRoutes(SubscriptionController);
  }
}

希望这能帮上忙

相关问题