- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在为守卫中的服务注入(inject)而苦苦挣扎。
好吧,我做了一个 JwtAuthGuard
,它需要我的 FirebaseService
和 UserService
。
所以我认为创建一个 AuthGuardModule
会很有用,所以我只需要在具有 Controller
的模块中导入我的 AuthGuardModules
>,使用我的守卫。
不幸的是,我的 UserModule
也需要这个守卫。所以当我在我的 UserModule
中导入我的 AuthGuardModule
时,我得到一个 Circular Dependency Error
是很自然的。
然后,我在 Nest.js 中尝试了所有与 Circular Dependency Error
或多或少相关的事情,但无能为力。
有人可以告诉我如果:
Circular Dependency Error
?@Injectable()
export class JwtAuthGuard implements CanActivate {
private readonly logger = new Logger(JwtAuthGuard.name)
constructor(
private readonly firebaseService: FirebaseService,
private readonly userService: UserService
) { }
async canActivate(context: ExecutionContext): Promise<boolean> {
const request = context.switchToHttp().getRequest();
const token = request.headers['authorization'];
if (!token) {
throw new UnauthorizedException
}
try {
const firebaseUser = await this.firebaseService.getUserByToken(token)
request.user = await this.userService.getByEmail(firebaseUser.email)
return true
} catch (error) {
this.logger.error(this.canActivate.name, error)
throw new UnauthorizedException
}
}
}
@Module({
imports: [UserModule],
providers: [FirebaseService, JwtAuthGuard],
exports: [JwtAuthGuard]
})
export class AuthGuardModule {}
好吧,NestJS discord 的 jmcdo29 向我解释说:
Your
AuthGuardModule
should export theUserModule
and theFirebaseService
. Guards, when used in the@UseGuards()
decorator, are used in the context of the current controller's module, instead of being looked at as anInjectable
provider
所以我这样做了,它确实解决了我最初的问题,但我还有另一个循环依赖问题。
首先,让我们恢复一下我的架构:
UserModule
在我的数据库中创建一个用户@Module({
imports: [
AuthGuardModule
],
controllers: [AuthController],
providers: [AuthService, EmailService, FirebaseService],
})
export class AuthModule {}
@Module({
imports: [
forwardRef(() => AuthGuardModule),
BlobModule,
MongooseModule.forFeature([{ name: File.name, schema: FileSchema }])
],
controllers: [FileController],
providers: [FileService],
exports: [FileService],
})
export class FileModule {}
FileModule
,在修改头像时检查头像是否存在(我只有一个路径可以更新我所有用户的个人数据)AuthGuardModule
来使用我的 JwtAuthGuard
@Module({
imports: [
forwardRef(() => AuthGuardModule),
forwardRef(() => FileModule),
MongooseModule.forFeature([{ name: User.name, schema: UserSchema }])
],
controllers: [UserController],
providers: [UserService, FirebaseService],
exports: [UserService, FileModule]
})
export class UserModule {}
UserModule
来获取我的数据库中的用户@Module({
imports: [forwardRef(() => UserModule), FirebaseModule],
providers: [JwtAuthGuard, RegisterAuthGuard],
exports: [JwtAuthGuard, RegisterAuthGuard, FirebaseModule, UserModule]
})
export class AuthGuardModule {}
我可以使用 firebase 来存储我的用户头像并在前端进行,但我必须将它存储在 Azure Blob 存储中(这是强加给我的),所以 FileModule 会处理所有这些事情
所以,现在,感谢你们,我解决了我的 AuthGuardsModule -> UserModule 循环依赖,我有一个新的循环依赖问题:AuthGuardsModule -> UserModule -> FileModule
我在 FileModule 中设置了 AuthGuardsModule 的 forwardRef,但 nest 自然地告诉我要确保双向关系的每一侧都用“forwardRef()”装饰
所以我在 UserModule
中将 forwardRef
导入到我的 FileModule
中,但同样如此。
有什么想法吗?
最佳答案
从我的角度来看,您需要使用 @nestjs/common
包中的 forwardRef
方法,它负责在循环依赖发生时处理它.参见 Circular dependency - NestJS docs
需要考虑的一件事是您的 JwtAuthGuard
的位置。它最初是在 AuthModule
中还是在另一个共享模块中?
我假设守卫最初在您的 AuthModule
中(例如,假设 /src/auth/guards/auth-guard.ts
)。
我还假设 FirebaseService
位于 FirebaseModule
中并从那里导出,并且 FirebaseModule
可注入(inject)不需要其他类取决于其他循环引用类/模块。 (在这种情况下,您需要通过在涉及的类/模块中添加更多 forwardRef
来指示 Nest 应如何处理它)
根据您提供的代码,您可以执行如下操作:
@Module({
imports: [forwardRef(() => UserModule), FirebaseModule],
providers: [...yourProviders],
exports: [...yourExportedInjectables]
})
export class AuthModule {}
@Module({
imports: [...requiredImports],
providers: [FirebaseService],
exports: [FirebaseService]
})
export class FirebaseModule {}
@Module({
imports: [forwardRef(() => AuthModule)],
providers: [...yourProviders],
exports: [...yourExportedInjectables]
})
export class UserModule {}
注意:您还可以根据具体用例在服务层使用forwardRef
。
NB2:守卫可以在一个共享模块中分组,该模块可以导入到 AuthModule
中,这样您就不必指定 Nest 在每个模块之间转发引用,而只需引用 AuthModule
在使用给定守卫的模块中。
希望对你有帮助!
同样,我对您的架构了解不多,因此我提供了基于假设的代码示例。
不要犹豫,发表评论/提供更多上下文,以便我可以相应地编辑我的答案。
关于typescript - Guards 和循环依赖中的服务注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71778848/
我已阅读有关依赖注入(inject)的信息。然后来了 构造函数注入(inject), setter/getter 注入(inject) 二传手注入(inject) 接口(interface)注入(in
我正在研究依赖注入(inject)模式。我看过很多例子,其中一个典型的例子是使用 XxxService/XxxRepository 作为例子。但是在我看来,按照UML的概念,类XxxRepositor
我开始使用 Google Guice。 我有一个简单的问题: javax.inject 的 @Inject 注释和 com.google.inject 的 有什么区别@Inject 一个 ? 谢谢。
当使用构造函数注入(inject)工厂方法时,依赖的属性不会得到解析。但是,如果在解析依赖的组件之前解析了工厂方法,则一切都会按预期工作。此外,当仅使用属性注入(inject)或构造函数注入(inje
我有这样的事情: class Root { public Root(IDependency dep) {} } class Dependency:IDependency { p
听完Clean Code Talks ,我开始明白我们应该使用工厂来组合对象。因此,例如,如果 House有一个 Door和 Door有一个 DoorKnob , 在 HouseFactory我们创建
情况:我需要在一些 FooClass 中进行惰性依赖实例化,所以我通过 Injector类作为构造函数参数。 private final Injector m_injector; public Foo
在编写代码时,我们应该能够识别两大类对象: 注入(inject)剂 新品 http://www.loosecouplings.com/2011/01/how-to-write-testable-cod
这个问题是关于 Unity Container 的,但我想它适用于任何依赖容器。 我有两个具有循环依赖关系的类: class FirstClass { [Dependency] pub
如果我有 10 个依赖项我需要注入(inject)并且不想在构造函数中有 10 个参数,我应该使用哪种注入(inject)模式? public class SomeClass { privat
我在使用 Angular2 DI 时遇到了问题。我尝试将一个类注入(inject)另一个类,它引发了以下错误: 留言:"Cannot resolve all parameters for 'Produ
对依赖注入(inject)还很陌生,我想弄清楚这是否是一种反模式。 假设我有 3 个程序集: Foo.Shared - this has all the interfaces Foo.Users -
我正在尝试了解 Angular 14 的变化,尤其是 inject()我可以将模块注入(inject)功能的功能,我不需要为此创建特殊服务..但我想我弄错了。 我正在尝试创建一些静态函数来使用包 ng
希望这个问题不是太愚蠢,我试图掌握更高级的编程原理,因此试图习惯使用 Ninject 进行依赖注入(inject)。 因此,我的模型分为几个不同的 .dll 项目。一个项目定义了模型规范(接口(int
我最近一直在大量使用依赖注入(inject)、测试驱动开发和单元测试,并且开始喜欢上它。 我在类中使用构造函数依赖,这样我就可以为单元测试注入(inject)模拟依赖。 但是,当您实际需要生产环境中的
我有下面的代码来使用 Guice 进行依赖注入(inject)。第一个是使用构造函数注入(inject),而另一个是直接在字段上方添加 @Inject。这两种方式有什么区别吗? Guice官网似乎推荐
这个问题在这里已经有了答案: Angular2 Beta dependency injection (3 个答案) 关闭 7 年前。 我正在使用 angular2 测试版。并在使用 @Inject
有没有可能做这样的事情? (因为我尝试过,但没有成功): @Injectable() class A { constructor(private http: Http){ // <-- Injec
我很恼火必须通过 Constructor 传递管道对象,因为我想为业务实体或要传递的值保留构造函数参数。 所以我想通过 setter ,但只要这些 setter 没有被填充,我的包含依赖项的对象就不应
假设我有这个: SomePage.razor: @inject Something something @page "/somepage" My Page @code { // Using
我是一名优秀的程序员,十分优秀!