mongodb 领域 js collection.watch() 失败并显示 [AbortError: Aborted]

问题描述 投票:0回答:1

我正在使用 mongodb 开发 React Native 应用程序。 我使用的是领域节点 SDK 12.13.1。 React Native 版本是 0.75.4.

谁能教我这是什么问题吗?

我当前的代码如下。

try {
  var db = await MongoEngine.getDB();
  var collection = db.collection("Notification");

  var changeStream = collection.watch();
  for await (var change of changeStream) {

    this.changeListeners.forEach(listener => {
      try {
        listener.callback();
      } catch(error) {
        console.error("error: ", error.message);
      }
    });
  }
  
} catch(error) {
  console.error("error: ", error);
}

这里 MongoEngine.getDB() 只是连接到 mongdo atlas 服务应用程序。

调用此函数时,不会发生错误,但一段时间后(大约几分钟)此函数失败并显示 [AbortError: Aborted]

node.js mongodb react-native realm-js
1个回答
0
投票

在 MongoDB 中使用更改流时,连接可能会在一段时间不活动后中止。这通常是由于数据库或网络配置关闭空闲连接以节省资源所致。

潜在的解决方案包括:自动重连和更新配置,以保持更长时间的空闲连接。

async function watchCollection() {
  while (true) {
    try {
      const db = await MongoEngine.getDB();
      const collection = db.collection("Notification");
      const changeStream = collection.watch([], { maxAwaitTimeMS: 60000 });

      for await (const change of changeStream) {
        this.changeListeners.forEach(listener => {
          try {
            listener.callback();
          } catch (error) {
            console.error("Callback error: ", error.message);
          }
        });
      }
    } catch (error) {
      console.error("Stream error: ", error.message);
      await new Promise(resolve => setTimeout(resolve, 5000)); // Retry delay
    }
  }
}

另一种选择:

在调用 watch() 时设置 maxAwaitTimeMS,以指定服务器在返回空结果之前等待新更改的最长时间(以毫秒为单位)。它有助于保持连接活跃:

© www.soinside.com 2019 - 2024. All rights reserved.