Firebase + Cloud功能动态onCall

时间:2018-09-18 17:14:33

标签: angular firebase firebase-realtime-database google-cloud-functions

我正在使用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不兼容(如果是,则有任何建议吗?)?

1 个答案:

答案 0 :(得分:2)

您不能使用可调用函数来提供持续的结果。您必须从onCall返回一组结果,然后函数终止。如果需要更多更新,则必须再次调用该函数,但最好是客户端可以使用Firebase SDK直接查询数据库并在结果更改时侦听结果。