我正在使用angular / firebase网络应用程序,并且开始在onCall上创建云函数。
我的应用基于聊天室:
messages
|__1
|__ 0
|__ author: "foo"
|__ message: "hello world"
|__ playerExcluded: "foo2"
|__ 1
|__ author: "foo2"
|__ message: "hello world"
|__ playerExcluded: "foo"
我想列出currentUser!= playerExluded的所有消息(用户可以看到除他以外的消息以外的所有消息),这就是为什么我开始寻找云功能的原因。在执行此操作之前,我只是先尝试一些事情,但它并没有达到我想要的效果。
这是我写的:
云功能:
const getMessages = functions.https.onCall((data, context) => {
console.log('data: ', data);
return new Promise((resolve, reject) => {
admin.database().ref('/messages').child(data).on('value', msg => {
resolve(msg.val());
});
})
});
module.exports = { getMessages };
(我使用Promise是因为没有它,它什么也不会返回。我使用.on而不是.once是因为我需要动态获取消息)。
角部分:
服务:
messages: Message[] = [];
messagesSubject = new Subject<Message[]>();
getMessages() {
firebase.functions().httpsCallable("getMessages")("1").then(result => {
console.log("result: ", result);
this.messages = [result.data[0]]; // let's try with first message
console.log(this.messages);
this.emitMessages();
}).catch(error => {
console.log("error:", error);
});
}
emitMessages() {
this.messagesSubject.next(this.messages);
}
组件:
messages;
messagesSubscription: Subscription;
constructor(private messageService: MessageService) { }
ngOnInit() {
this.messageService.getMessages();
this.messagesSubscription = this.messageService.messagesSubject.subscribe((result) => {
console.log(result);
this.messages = result;
});
}
一切正常。但这不是动态的,我需要刷新页面以查看更改。
我做错了吗? Firebase查询“ .on”是否与云函数.onCall和httpsCallable不兼容(如果是,则有任何建议吗?)?
答案 0 :(得分:2)
您不能使用可调用函数来提供持续的结果。您必须从onCall返回一组结果,然后函数终止。如果需要更多更新,则必须再次调用该函数,但最好是客户端可以使用Firebase SDK直接查询数据库并在结果更改时侦听结果。