Node.js 在发布事件之前,如何确保聚合存在?
我正在浏览Wolkenkit API。。。如何知道哪些命令需要聚合ID,哪些命令不需要聚合ID,还不是100%清楚 据我所知,客户端api提供了如下内容Node.js 在发布事件之前,如何确保聚合存在?,node.js,domain-driven-design,cqrs,event-sourcing,wolkenkit,Node.js,Domain Driven Design,Cqrs,Event Sourcing,Wolkenkit,我正在浏览Wolkenkit API。。。如何知道哪些命令需要聚合ID,哪些命令不需要聚合ID,还不是100%清楚 据我所知,客户端api提供了如下内容 app.accounting.invoice().issue({ amount: 1000 }); 这对于创建新的发票,是很好的,但是不可能运行以下打算更新现有内容的操作 app.accounting.invoice().update({ amount: 10 }); 我假设这个检查应该进入命令函数,但是我该如何编写它呢 const
app.accounting.invoice().issue({
amount: 1000
});
这对于创建新的<代码>发票,是很好的,但是不可能运行以下打算更新现有内容的操作
app.accounting.invoice().update({
amount: 10
});
我假设这个检查应该进入命令函数,但是我该如何编写它呢
const commands = {
update (invoice, command, mark) {
const canInvoiceBeUpdated = // ...
if (!canInvoiceBeUpdated) {
return mark.asRejected('...');
}
// ... update invoice
mark.asDone();
}
};
什么进入了canInvoiceBeUpdated
check?中的回答2018-06-08
我将试着向您解释:如果您想要一个新的聚合,您可以省略ID。因此,例如,为了坚持聊天示例,当您想要发送新消息时,您可以:
app.communication.message().send({ /* ... */ });
相反,如果您想编辑现有邮件(例如,为了喜欢它),则必须提供邮件的ID:
const messageId = '...';
app.communication.message(messageId).like({ /* ... */ });
在每个命令中,您可能希望检查它是否仅对新聚合(我们称之为构造函数命令)或现有聚合起作用。检查这一点的最简单方法是使用聚合的exists
函数,对于新聚合,该函数返回true
,否则返回false
。因此,在命令内部,您可以执行以下操作:
const commands = {
send (message, command, mark) {
if (!message.exists()) {
return mark.asRejected('Aggregate does not exist yet.');
}
// ...
mark.asDone();
}
};
如果您不想每次都手动执行此操作,您也可以为此使用中间件,例如…上一个示例归结为:
const { only } = require('wolkenkit-command-tools');
// ...
const commands = {
send: [
only.ifExists(),
(message, command, mark) {
// ...
mark.asDone();
}
]
};
请注意,此中间件模块的当前版本为
3.0
,但在发布wolkenkit2.0
之前,您必须使用wolkenkit命令工具的2.0
PS:exists
功能现在也是的一部分。