当从流中读取事件的“maxCount”增加超过 20 时,NodeJs 的 Eventstore 客户端(@eventstore/db-client)停止执行

0 javascript events node.js eventstoredb

当我有以下配置时,程序运行良好:

let events = eventstoreClient.readStream(
       streamName,
       {
         fromRevision: END,
         direction: BACKWARDS,
         maxCount: 20
       }
     );
Run Code Online (Sandbox Code Playgroud)

但是,当 maxCount 设置为 100 或 1000 或未提供 maxCount 选项时,程序会卡住(即无法进一步读取流/事件)!

小智 6

readStream返回一个可读流,它将在内部缓冲事件,直到它们超过highWaterMark阈值。数据将位于内部队列中直到被消耗,并且流将暂时停止从服务器读取事件,直到当前缓冲的数据被消耗。

当您请求 20 个事件时,它们会放入内部缓冲区中,因此在 20 个事件之后,流将关闭,NodeJS 很乐意停止执行。但是,如果您请求 100 或 1000 个事件,一旦内部缓冲区已满,流将不会关闭,因为仍有事件要从服务器读取,并且它将等待您消耗这些事件。

您需要从缓冲区中提取事件以允许流式读取完成。这可以通过多种方式完成,例如:

迭代 steam:

for await (const { event } of events) {
  console.log(event);
}
Run Code Online (Sandbox Code Playgroud)

或添加事件监听器:

events.on("data", (event) => {
  console.log(event);
});
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关缓冲的更多信息:https ://nodejs.org/api/stream.html#buffering