You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EventStore投影链接后事件消失问题求助

EventStore投影linkTo后原有事件消失的原因及解决办法

问题原因

  1. 流名称大小写不匹配
    EventStore的流名称是大小写敏感的。你初始创建的流是Quest-3(首字母大写),但投影代码里用的是"quest-" + event.data.questId(全小写),这会生成一个全新的quest-3流。你后续读取的是这个小写流,自然看不到原来Quest-3流里的quest-created事件——它其实还在原来的大写流里,只是你读错了流。

  2. 投影监听的Category不匹配
    你的投影用fromCategory('user')监听user类别下的事件,但创建quest-created事件时,是发到Quest-3流。EventStore默认按流名称的第一个-分割划分category,所以Quest-3属于Quest类别,根本不会被这个user类别的投影捕获,也就不会被link到目标流里。

  3. 事件编号变化的本质
    你看到的事件编号变化,是因为quest-3是新流,里面只有投影link过来的quest_started事件,它的事件编号从1开始计数,和原来Quest-3流的编号完全无关。

解决办法

1. 统一流名称大小写

把投影里的流名称前缀改成和创建时一致的大小写:

fromCategory('user')
.when({
    $init: function () {
        return {
            totalHealths: {}
        };
    },
    quest_started: function (state, event) {
       // 改为和创建时一致的"Quest-"前缀
       linkTo("Quest-" + event.data.questId, event);
    },
});

或者在创建事件时统一用小写前缀,确保所有地方的流名称完全一致。

2. 调整投影监听范围(可选)

如果需要投影也处理quest-created事件,要么把创建事件的流名称改成user-Quest-3(让它属于user类别),要么把投影的监听范围改成fromAll()(监听所有流的事件),或者fromCategory('Quest')(监听Quest类别):

fromAll()
.when({
    $init: function () {
        return {
            totalHealths: {}
        };
    },
    quest_started: function (state, event) {
       linkTo("Quest-" + event.data.questId, event);
    },
    quest_created: function (state, event) {
       // 把quest-created也link到对应流里
       linkTo("Quest-" + event.data.questId, event);
    },
});

3. 验证读取流的代码

确保你读取事件时用的流名称和创建、投影里的完全一致,比如统一用Quest-3或者quest-3,不要混着用。

额外注意

投影里的expectedVersion参数在linkTo里是用来指定目标流的预期版本的,你用event.eventNumber是错误的——event.eventNumber是原事件在它所在流的编号,不是目标流的版本号。如果要避免并发问题,应该先读取目标流的当前版本再传入,或者用ExpectedVersion.Any。

内容的提问来源于stack exchange,提问作者maria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:05:32