首页 > 解决方案 > 具有依赖项的 Nestjs 中间件

问题描述

我无法创建具有两个依赖项(TypeORModule.forFeature([USER])、FirebaseModule)的中间件。我所做的是创建一个 AuthModule,如下所示:

    @Module({
    imports: [
        FirebaseModule,
        TypeOrmModule.forFeature([User])
    ],
    providers: [
        AuthMiddleware
    ],
})

和看起来像这样的中间件

export class AuthMiddleware implements NestMiddleware {
constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
    private firebaseService: FirebaseService
) {}

async use(req: Request, res: Response, next: () => void) {...}    
}

和我的应用程序模块,看起来像这样

@Module({
imports: [
    TypeOrmModule.forRoot({
        ...config.get("database"),
        entities: [__dirname + '/entities/**/*.{js,ts}']
    }),
    AuthModule,
    exampleModule
],
providers: [
    AuthMiddleware
]
})

export class AppModule implements NestModule {
    configure(consumer: MiddlewareConsumer): any {
        consumer.apply(AuthMiddleware).forRoutes("*")
    }
}

我遇到了很多错误,我试图改变事情以使其工作,但我根本无法让它发生。我得到错误

请确保索引 [0] 处的参数 UserRepository 在模块(有时是 AppModule,有时是 exampleModule)上下文中可用。

如果其他模块(控制器模块,如提供 api 服务)也适用于它们,是否也需要导入中间件模块?

一般来说,我该如何继续实现依赖于外部模块的中间件?它们必须是模块,以便我可以导入需要的模块吗?

我很想得到一些帮助,谢谢!

标签: node.jsnestjs

解决方案


您不需要重新添加AuthMiddlewareAppModule'sproviders中。它已经存在于AuthModule. 此外,您可以将中间件绑定在AuthModuleif 中而不是在中,AppModule并且它将具有相同的全局范围。


推荐阅读