Cloud Functions(W/Firestore) 实时更新?
Cloud Functions(W/Firestore) Realtime Updates?
这是一个棘手的问题,我有一个 Cloud Function,它将所有数据放入某个集合(用户)中,通过应用程序调用(应用程序调用),然后我通过使用获取所有用户 html *ngFor。
当我删除、创建或更新此集合中的某些数据时,问题就来了,它永远不会相应地更新,需要我重新加载页面。
有没有可能把这个功能变成实时功能?
函数导出:
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>
您的云函数未实现实时侦听器。您正在使用 get()
,它会读取一次数据,然后停止侦听。
一般来说,Cloud Functions 不适合让听众存活,因为它们的存活时间不能超过 9 分钟。
如果您想保持沟通渠道畅通,请考虑以下备选方案:
在 允许长期侦听器的平台上实施侦听器,例如 Google App Engine、GKE 或几乎任何其他平台VM 或容器实例的提供者。
让您的客户端直接收听 Cloud Firestore。这是迄今为止获取实时更新的最有效方式,因为您不必构建自己的基础架构。事实上,您的 Cloud Functions 中的大部分代码可能应该在您的客户端应用程序中,而不是在服务器上。
这是一个棘手的问题,我有一个 Cloud Function,它将所有数据放入某个集合(用户)中,通过应用程序调用(应用程序调用),然后我通过使用获取所有用户 html *ngFor。 当我删除、创建或更新此集合中的某些数据时,问题就来了,它永远不会相应地更新,需要我重新加载页面。 有没有可能把这个功能变成实时功能?
函数导出:
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>
您的云函数未实现实时侦听器。您正在使用 get()
,它会读取一次数据,然后停止侦听。
一般来说,Cloud Functions 不适合让听众存活,因为它们的存活时间不能超过 9 分钟。
如果您想保持沟通渠道畅通,请考虑以下备选方案:
在 允许长期侦听器的平台上实施侦听器,例如 Google App Engine、GKE 或几乎任何其他平台VM 或容器实例的提供者。
让您的客户端直接收听 Cloud Firestore。这是迄今为止获取实时更新的最有效方式,因为您不必构建自己的基础架构。事实上,您的 Cloud Functions 中的大部分代码可能应该在您的客户端应用程序中,而不是在服务器上。