云功能(带Firestore)实时更新?

时间:2019-04-24 18:23:54

标签: angular google-cloud-firestore google-cloud-functions ionic4

这是一个令人讨厌的问题,我有一个Cloud Function,它通过应用程序(应用程序调用)调用将所有数据收集到某个集合(用户)中,然后使用* ngFor提取所有用户html。 当我删除,创建或更新此集合中的某些数据时,问题就来了,但它从未相应地更新,需要我重新加载页面。 是否有可能在实时功能中启用此功能?

函数导出:

  exports.listarAllUsuarios = functions.https.onCall((data, context) => {
      if(context.auth.token.admin !== true) {
          return {
              error: "Você não possui acesso a essa função"
          };
      }
      return listAllUsers();
  });

    function listAllUsers() {
        let a:string [] = [];
        return db.collection('usuario').get()
        .then((snapshot) => {
          snapshot.forEach((doc) => {
            a.push(doc.data());
          });
          return a;
        })
        .catch((error) => {
          return error.message;
        });
      }

应用程序.ts

  export class ListUserPage implements OnInit {

    listarUser = firebase.functions().httpsCallable('listarAllUsuarios');

    usuario:string[]=[];

    constructor(
    private toast: ToastService,
    ) {


    }

    ionViewWillEnter() {

      this.usuario = [];

      this.listarUser().then(result => {
          return result.data;
      }).then(result => {
        result.map(dados => {
          this.usuario.push(dados);
        });
      }).catch(error => {
        this.toast.errorToast('Erro ao carregar lista de usuários', error)
      });
    }

    ngOnInit() {

    }

    detalhesUsuario(usuario) {
      console.log(usuario)
    }

HTML

    <ion-item *ngFor="let usuario of this.usuario">
      <ion-label (click)="detalhesUsuario(usuario)">
        <h1>UID: {{usuario.uid}}</h1>
        <h2>Nome: {{usuario.nomeCompleto}}</h2>
        <h2>E-Mail: {{usuario.email}}</h2>
        <h2>Acesso: {{usuario.role}}</h2>
      </ion-label>
    </ion-item>

1 个答案:

答案 0 :(得分:0)

您的Cloud Function没有实现实时侦听器。您正在使用get(),它将读取一次数据,然后停止监听。

通常,云功能不太适合使听众保持生命,因为它们的生存时间不能超过9分钟。

如果您想保持沟通渠道畅通,请考虑以下替代方案:

  1. 在允许长期监听器的平台上实现监听器,例如Google App Engine,GKE或几乎任何VM或容器实例提供商。

  2. 让您的客户端直接收听Cloud Firestore。到目前为止,这是获取实时更新的最有效方法,因为您无需构建自己的基础结构。实际上,来自Cloud Function的大多数代码可能应该在客户端应用程序内部,而不是在服务器上。