Облачная функция Firebase Запрос не работает - PullRequest
0 голосов
/ 04 февраля 2019

Я развернул функцию со следующим запросом:

admin.firestore().collection("fcm").where("devices",'array-contains', mobile).get().then((snapshots)=> {...});

Это возвращает следующую ошибку из журнала функций облака:

msgTrigger: Function execution started

msgTrigger: Function returned undefined, expected Promise or value

msgTrigger: Function execution took 8429 ms, finished with status: 'ok'

msgTrigger: Unhandled rejection

msgTrigger: TypeError: Cannot read property 'Symbol(Symbol.iterator)' of undefined at admin.firestore.collection.where.get.then (/user_code/index.js:23:65) at process._tickDomainCallback (internal/process/next_tick.js:135:7)

Кто-нибудь, пожалуйста?

Бои в течение нескольких дней с редактором здесь.решил опубликовать мой код функции по частям:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
var msgData;
var mobile;

Вторая часть:

exports.msgTrigger = functions.firestore
  .document('Messages/{MessageID}')
  .onCreate((snapshot, context) => {
      msgData = snapshot.data();
      mobile = msgData.mobile;

      admin.firestore().collection("fcm").where("devices", 'array-contains', mobile).get().then((snapshots) => {

Третья часть:

var tokens = [];
if (snapshots.empty) {
  console.log('No devices');
} else {
  for (var token of snapshot.docs) {
    tokens.push(token.data().token);
  }
  var payLoad = {
    "notification": {
      "title": "de " + msgData.name,
      "body": "Alerta de Emergência!",
      "sound": "default",
      "icon": msgData.icon
    },
    "data": {
      "remetente": +msgData.name,
      "mensagem": "Alerta de Emergência!"
    }
  }

Четвертая часть:

return admin.messaging().sendToDevice(tokens, payLoad).then((response) => {
console.log("mensagens enviadas");
}).catch((err) => {
console.log("erro: " + err);
});
}
});

});

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Хорошо, за что я наконец нашел виновника:

for (var token of snapshot.docs) {

снимок должен быть снимком.Да, это изумительно, и мне понадобилось не меньше, чем отличная команда поддержки Firebase, чтобы указать мне на это.Желаемая Android Studio могла бы обнаружить такие глупые опечатки в js-коде.

Все равно отметит ответ Рено, так как он помог оптимизировать мой код и дал мне несколько полезных советов по пути.

0 голосов
/ 08 февраля 2019

Firestore 0.8 является довольно старой версией, см. https://cloud.google.com/nodejs/docs/reference/firestore/0.8.x/. Только с версии 0.16 вы можете использовать оператор запроса array-contains, см. https://github.com/googleapis/nodejs-firestore/releases/tag/v0.16.0. Так что вам следует обновиться до последней версии.

Я также сначала адаптировал ваш код функции (и это очень важно, см. Ниже), возвращая обещание, возвращенное первой асинхронной задачей, а затем реорганизовал цепочку ваших обещаний в if / then / else.

Правильно ли выполняется сейчас ??

   const functions = require('firebase-functions');
   const admin = require('firebase-admin');
   admin.initializeApp();  // Here changed, see https://firebase.google.com/docs/functions/beta-v1-diff#new_initialization_syntax_for_firebase-admin

   exports.msgTrigger = functions.firestore
      .document('Messages/{MessageID}')
      .onCreate((snapshot, context) => {
        const msgData = snapshot.data();  //No need to declare this outside of the Cloud Function, see https://www.youtube.com/watch?v=2mjfI0FYP7Y
        const mobile = msgData.mobile;

        return admin.   // <- HERE return
          .firestore()
          .collection('fcm')
          .where('devices', 'array-contains', mobile)
          .get()
          .then(snapshots => {
            let tokens = [];
            if (snapshots.empty) {
              console.log('No devices');
              return null;
            } else {
              for (var token of snapshot.docs) {
                tokens.push(token.data().token);
              }
              var payLoad = {
                notification: {
                  title: 'de ' + msgData.name,
                  body: 'Alerta de Emergência!',
                  sound: 'default',
                  icon: msgData.icon
                },
                data: {
                  remetente: +msgData.name,
                  mensagem: 'Alerta de Emergência!'
                }
              };
              return admin.messaging().sendToDevice(tokens, payLoad);
            }
          })
          .catch(err => {
            console.log('erro: ' + err);
            return null;
          });
      });

Почему важно возвращать обещания, возвращаемые асинхронными задачами?Посмотрите 3 видео о «Обещаниях JavaScript» из официальной серии видеороликов Firebase (https://firebase.google.com/docs/functions/video-series/) для ответа !!

Удаление ».where (« устройства »,« массив-содержит », мобильный)"выдает ту же ошибку. Я добавил msgData.name и msgData.mobile в console.log, и они были напечатаны, поэтому первая часть в порядке:

1: 31: 05.140 AM
msgTrigger
Function execution started
1: 31: 11.289 AM
msgTrigger
Nome: Alan
1: 31: 11.291 AM
msgTrigger
mobile: 91983372845
1: 31: 11.291 AM
msgTrigger
erro: TypeError: Cannot read property 'Symbol(Symbol.iterator)' of undefined
1: 31: 11.297 AM
msgTrigger
Function execution took 6158 ms, finished with status: 'ok'

And here is the fcm document

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...