【发布时间】:2021-08-15 06:01:22
【问题描述】:
我正在试验和学习nestjs,但我无法为以下场景找到合适的解决方案:
模块用户
模块书
模块仪表板
仪表板是一个graphql,可以解决他调用图书服务和图书用户服务的需求。
我只知道解决一本书的顺序,同时更新用户信息的两种方法。
1- 在 graphql 仪表板上使用一个突变,该突变还调用一个事件,该事件将被相应的服务监听,该服务将更新这个新订单,这里是这个用例的例子:https://github.com/nestjs/nest/tree/master/sample/30-event-emitter
2- 使用依赖注入考虑仪表板具有用户和书籍的相应服务的依赖关系,并简单地更新所需的一切。
问题:
解决方案 1 事件不提供回调或响应,它充当事件的发射,之后我无法获得反馈,更像是一个动作或命令而不是一个函数。
方案2仪表盘知道的太多了,我不需要提供整个模块作为DI,在订单发生后只调用一个方法来更新用户信息。
我需要什么,但我没有找到任何软件。一个在它执行后我可以监听的事件......换句话说,类似于以下内容:
export interface OrderResults {
user: UserCustomer;
order: OrderCreated;
}
@Injectable()
export class Dashboard {
constructor(private reaonly eventEmitter: EventEmitter2): Promise<OrderResults> {}
async createOrder(order) {
const orderEventResults = await this.eventEmitter.emit('create.order', order)
return orderEventResults
}
}
订单事件的结果,是用户和订单得到了正确的通知和更新,通过用户/订单的监听器的结果来解决。
我的仪表板完全不知道如何或由谁来处理此问题,但会向客户提供与此事件相对应的结果,这些结果由负责此事件的服务解决。
我们欢迎任何有关这方面的帮助或指导。
【问题讨论】:
-
我不认为你可以发出事件并等待它们的结果发回响应,所以我会选择解决方案#2。如果您担心仪表板知道的太多,也许您可以根据仪表板的需要创建另一个服务(?)
-
可能与 rxjs 或观察发生的事件有关,老实说,如果我有一个动作命令或一个事件,我觉得我听起来不像,为什么不是我可以等待其他服务的功能。可能对框架的意见或范围来说这是一个不好的做法,或者我应该尝试以不同的方式这样做......
标签: javascript node.js typescript nestjs