Firebase + Облачные функции динамического onCall - PullRequest
0 голосов
/ 18 сентября 2018

Я работаю над веб-приложением 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 голосов
/ 18 сентября 2018

Вы не можете использовать вызываемую функцию для получения текущих результатов.Вы должны вернуть один набор результатов из onCall, после чего функция завершается.Если вам требуется больше обновлений, вам придется снова вызывать функцию, но лучше, если клиент сможет использовать SDK Firebase для непосредственного запроса к базе данных и прослушивания результатов по мере их изменения.

...