Nestjs 中的对象生命周期在 类 之间
objects lifecycle in Nestjs between classes
我想了解 Nestjs 如何处理对象的持久化。在 Nodejs 中,您可以声明一个对象,它将在应用程序的生命周期内持续存在。然而,Nestjs 由类似于 Angular 的“类” 的协作组成。尽管 Angular 具有可以在应用程序的生命周期内保留对象的 BehaviourSubject,但我不确定如何在 Nestjs 中使用 Redis 或其他一些内存存储来执行此操作。例如,如果我有一个 controllerA 调用一个 serviceA(这个服务有一个对象,其值为:
Aobject=[]=[];
Aobject.push({"test"})).
如果我有另一个使用 DI 访问 serviceA 的 controllerB,Aobject 的值是什么?有人可以解释 Nestjs 如何处理 类 之间 Aobject 的生命周期吗?我是否使用内存存储来实现这一点?
编辑:根据第一个答案,我正在编辑问题。
我正在使用默认范围,因为我希望所有访问者都通过 serviceA 修改 Aobject。似乎正在发生的事情是,当 serviceA 被 controllerB 调用时,Aobject 为 null ...一个空数组,就像它在初始化时一样。这非常令人费解,因为我希望它具有 serviceA 设置的最后一个值,无论是谁发起调用。
这种情况符合我的预期:
cronService 调用 serviceC....serviceC 调用 serviceA 将 Aobject 设置为 ['TEST'] 然后 returns 到 serviceC... 然后 returns 到 cronService... cronService 然后调用 serviceA 并检查 Aobject 的值...该值是预期的 'TEST'...但是当 serviceB 调用 serviceA 时,Aobject 的值为空[]。
范围是否由 cronService 控制,当我们更改为 serviceB 时,它是一个新范围.. Aobject 的新实例??
这取决于 serviceA
使用什么 injection scope。如果不指定注入范围,将使用 DEFAULT
范围,这意味着 controllerA
和 controllerB
将共享 serviceA
的单例实例。假设serviceA
有一个对象Aobject
,两个控制器都会修改同一个对象,如果修改动作是通过serviceA
.
发生的
如果 serviceA
使用 REQUEST
作用域,将针对每个用户请求创建一个不同的 serviceA
实例,并在请求完成时对它们进行垃圾回收。
第三个注入范围是TRANSIENT
范围。在这种情况下,每个控制器都会有一个不同的 serviceA
实例,但这些实例是在启动时创建的,不会在每次请求后终止。
我想了解 Nestjs 如何处理对象的持久化。在 Nodejs 中,您可以声明一个对象,它将在应用程序的生命周期内持续存在。然而,Nestjs 由类似于 Angular 的“类” 的协作组成。尽管 Angular 具有可以在应用程序的生命周期内保留对象的 BehaviourSubject,但我不确定如何在 Nestjs 中使用 Redis 或其他一些内存存储来执行此操作。例如,如果我有一个 controllerA 调用一个 serviceA(这个服务有一个对象,其值为:
Aobject=[]=[];
Aobject.push({"test"})).
如果我有另一个使用 DI 访问 serviceA 的 controllerB,Aobject 的值是什么?有人可以解释 Nestjs 如何处理 类 之间 Aobject 的生命周期吗?我是否使用内存存储来实现这一点?
编辑:根据第一个答案,我正在编辑问题。 我正在使用默认范围,因为我希望所有访问者都通过 serviceA 修改 Aobject。似乎正在发生的事情是,当 serviceA 被 controllerB 调用时,Aobject 为 null ...一个空数组,就像它在初始化时一样。这非常令人费解,因为我希望它具有 serviceA 设置的最后一个值,无论是谁发起调用。
这种情况符合我的预期:
cronService 调用 serviceC....serviceC 调用 serviceA 将 Aobject 设置为 ['TEST'] 然后 returns 到 serviceC... 然后 returns 到 cronService... cronService 然后调用 serviceA 并检查 Aobject 的值...该值是预期的 'TEST'...但是当 serviceB 调用 serviceA 时,Aobject 的值为空[]。 范围是否由 cronService 控制,当我们更改为 serviceB 时,它是一个新范围.. Aobject 的新实例??
这取决于 serviceA
使用什么 injection scope。如果不指定注入范围,将使用 DEFAULT
范围,这意味着 controllerA
和 controllerB
将共享 serviceA
的单例实例。假设serviceA
有一个对象Aobject
,两个控制器都会修改同一个对象,如果修改动作是通过serviceA
.
如果 serviceA
使用 REQUEST
作用域,将针对每个用户请求创建一个不同的 serviceA
实例,并在请求完成时对它们进行垃圾回收。
第三个注入范围是TRANSIENT
范围。在这种情况下,每个控制器都会有一个不同的 serviceA
实例,但这些实例是在启动时创建的,不会在每次请求后终止。