NodeJS中的Firestore实时更新连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NodeJS中的Firestore实时更新连接相关的知识,希望对你有一定的参考价值。

我正在开发NodeJS Web应用程序以通过Admin SDK从Firestore DB接收实时更新。

这是Firestore对象的初始化代码。部署应用程序(在AWS Elastic Beanstalk上)后,它仅执行一次:

const admin = require('firebase-admin');

var serviceAccount = require('./../key.json');

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount)
});

var db = admin.firestore();

FUNC.firestore = db;

然后,我在websocket通信中使用此firestore对象将实时更新发送到浏览器。这个想法是使用服务器作为浏览器和Firestore之间的代理。

socket.on('open', function (client) {
    var query = FUNC.firestore.collection("notifications").doc(client.user.id.toString()).collection("global");
    query.onSnapshot(querySnapshot => {
        querySnapshot.docChanges().forEach(change => {
            client.send({ id: change.doc.id, body: change.doc.data(), type: change.type });
        });
    }, err => {
        console.log(`Encountered error: ${err}`);
    });
});

socket.on('close', function (client) {
    var unsub = FUNC.firestore.collection("notifications").doc(client.user.id.toString()).collection("global").onSnapshot(() => {
    });
    unsub();
});

它工作了一会儿,但是几个小时后,客户端停止接收onSnapshot()更新,并且一段时间后服务器记录了错误:Encountered error: Error: 10 ABORTED: The operation was aborted.

怎么了?我应该在每个连接上初始化firestore吗?是否存在生命周期错误?

谢谢

编辑(一个非常糟糕的解决方案)

我已经尝试为每个登录用户创建一个firebase-admin应用实例,并以此方式更改了代码

const admin = require('firebase-admin');

var serviceAccount = require('./../key.json');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

FUNC.getFirestore = function (user) {
  try {
    user.firebase = admin.app(user.id.toString());
    return user.firebase.firestore();
  } catch(e) {
    //ignore
  }

  var app = admin.initializeApp({
    credential: admin.credential.cert(serviceAccount)
  }, user.id.toString());

  user.firebase = app;

  return user.firebase.firestore();
}

FUNC.removeFirebase = function (user) {
  if (user.firebase) {
    user.firebase.delete();
  }
}

然后是套接字侦听器:

    self.on('open', function (client) {
        var query = FUNC.getFirestore(client.user).collection("notifications").doc(client.user.id.toString()).collection("global");
        query.onSnapshot(querySnapshot => {
            querySnapshot.docChanges().reverse();
            querySnapshot.docChanges().forEach(change => {
                client.send({ id: change.doc.id, body: change.doc.data(), type: change.type });
            });
        }, err => {
            console.log(`Encountered error: ${err}`);
        });
    });

    self.on('close', function (client) {
        var unsub = FUNC.getFirestore(client.user).collection("notifications").doc(client.user.id.toString()).collection("global").onSnapshot(() => {
        });
        unsub();
        FUNC.removeFirebase(client.user);
});

所以当客户端由于某种原因而断开连接时,服务器删除了它的Firebase应用程序,它可以工作,但是我注意到服务器上的huge内存泄漏,我需要一些帮助] >>

我正在开发一个NodeJS Web应用程序,以通过Admin SDK从Firestore DB接收实时更新。这是Firestore对象的初始化代码。部署应用程序后,它仅执行一次(在...

答案

更新后的答案

以上是关于NodeJS中的Firestore实时更新连接的主要内容,如果未能解决你的问题,请参考以下文章

等到firestore中的数据成功更新

如何更新firestore中的数组[重复]

Android - Firestore/Firebase 实时数据库“.info/connected”返回错误的连接状态

设置 Firestore 文档时如何检测不存在的网络连接

使用云功能更新 Firestore 文档

停止在颤动中收听 Cloud Firestore 中的快照更新