EventStore合并两流Projection问题:mergeStream0流未生成
我来帮你梳理一下为什么用fromStreams创建Projection后,mergeStream0流没有出现——代码保存成功只是第一步,还有几个关键环节需要检查:
源流没有触发事件:
fromStreams监听的是storeIdStream7和storeIdStream,只有当这两个流中有新事件产生(或者Projection启动后回溯已有事件,取决于Projection的模式),when里的逻辑才会执行,进而触发emit创建mergeStream0。如果这两个源流当前是空的,或者Projection启动后没有新事件进来,目标流自然不会被创建。
👉 解决办法:往其中一个源流提交一个测试事件,比如用EventStore CLI执行:eventstore-cli append-to-stream storeIdStream -e '{"type":"testEvent"}' -t testEventType之后再检查
mergeStream0是否存在。Projection未处于运行状态:
代码保存成功不代表Projection已经在运行。你需要确认它的状态是Running,而不是Stopped或Idle。
👉 解决办法:通过EventStore管理界面(或CLI命令es projections list)查看Projection状态,若未运行则手动启动它。emit逻辑的潜在问题:
你的代码里when函数返回了null,这会重置Projection的状态,虽然理论上不影响emit执行,但有些版本的EventStore Projection可能对返回值有隐性要求。可以尝试修改为返回当前状态(哪怕是空对象):var create = function () { fromStreams(['storeIdStream7', 'storeIdStream']) .when(function(state, event) { emit('mergeStream0', 'mergeType', '123'); return state || {}; // 返回状态而非null,避免重置 }); }; create()权限或日志排查:
如果EventStore启用了权限控制,当前用户可能没有创建流的权限,导致emit失败但Projection保存成功。
👉 解决办法:查看EventStore的日志文件,检查是否有与流创建相关的权限错误;或者用管理员权限重新部署Projection测试。流名称拼写/大小写问题:
EventStore的流名称是大小写敏感的,确认你查询的流名称确实是mergeStream0,没有拼写错误(比如大小写不一致)。
内容的提问来源于stack exchange,提问作者patrick

