Я работаю над веб-приложением 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 (если да, есть какие-нибудь предложения?)?