Node.js 在发布事件之前,如何确保聚合存在?

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

我正在浏览Wolkenkit API。。。如何知道哪些命令需要聚合ID,哪些命令不需要聚合ID,还不是100%清楚

据我所知,客户端api提供了如下内容

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
,但在发布wolkenkit
2.0
之前,您必须使用
wolkenkit命令工具的
2.0

PS:
exists
功能现在也是的一部分。