Функция Firestore для обмена сообщениями в облаке не работает должным образом

#javascript #firebase #google-cloud-firestore #google-cloud-functions #firebase-cloud-messaging

# #javascript #firebase #google-cloud-firestore #google-cloud-функции #firebase-cloud-messaging

Вопрос:

То, что я пытаюсь сделать, это запустить задание, когда в определенное время оно извлечет определенное поле из моего документа и отправит пользователю уведомление с использованием извлеченного содержимого.

Но проблема в том, что тело уведомления остается пустым. Я попытался войти, если все, что я извлекаю из документов, пусто или нет. Но, согласно журналам, в журналах переменная кавычек не пуста.

Пожалуйста, укажите мне, чего мне не хватает

 exports.sendDailyQuotes = functions.pubsub.schedule('0 7 * * *').timeZone('Asia/Kolkata').onRun(async (context) => {

    var today = new Date();

    today.setDate(today.getDate()   1);

    var currMonth = today.getMonth()   1;

    var dateQry = today.getDate()   "-"   currMonth;

    var quote;

    admin.firestore().collection('quotes').doc(dateQry).get().then(snapper => {
        quote = snapper.data().english;
        return "";
    }).catch(reason => {
        console.log(reason);
    });

    var dailyQuote = {
        notification : {
            title : "Daily Quote",
            body : quote,  //This is staying empty
        },
        topic : 'notifications'
    }

    let response = await admin.messaging().send(dailyQuote);
    console.log(response);

});
 

Ответ №1:

Вы неправильно используете promises при вызове Firestore. Вызов then не приостанавливает код, как await это происходит. Ваш код просто немедленно перейдет к вызову FCM, не дожидаясь завершения запроса.

Вместо этого вы должны снова использовать await, чтобы приостановить свой код для ожидания результата get() .

     const snapper = await admin.firestore().collection('quotes').doc(dateQry).get()
    quote = snapper.data().english;
 

Если вы хотите перехватить ошибку при вызове, который возвращает обещание, вам следует использовать try / catch для использования await .

Я настоятельно рекомендую потратить время на то, чтобы научиться эффективно использовать promises, иначе вы будете продолжать сталкиваться со странными ошибками, подобными этой, при реализации кода облачных функций.

Комментарии:

1. Спасибо, я действительно пытаюсь учиться, но иногда видео на YouTube и даже документация непонятны, поэтому я надеюсь, вы понимаете

2. Я собираюсь быть откровенным здесь — учебные пособия YouTube для продуктов Firebase не являются отличным способом изучения языков программирования. В руководствах обычно предполагается, что вы уже знаете язык. Я предлагаю сначала изучить JavaScript сам по себе, прежде чем пробовать что-то сложное в облачных функциях.

3. Еще раз спасибо за рекомендации