Прослушиватель обновлений Firebase Cloud Messaging Функция throws Функция вернула неопределенное, ожидаемое обещание или значение - PullRequest
0 голосов
/ 17 марта 2019

Я написал облачную функцию firebase, когда конкретное значение узла обновляется, тогда он должен иметь структуру triggered.firebase и код ниже. Я использую javascript firebase cli для этого. Дело в том, что в консоли firebase он продолжает выдавать Function returned undefined, expected Promise or value

Node name/Id
    |--sensore1:10;
    |--sensore2:20;
    |--sensore3:50;


 exports.pressureExceeding = functions.database.ref("Reservoir/{id}")
.onUpdate(evnt => {
  console.log(evnt.after.val);
  const sensData = evnt.after.val;
  const status = sensData.sensor3;
  console.log(evnt.after.val);
  if (status > 71) {
    const payLoad = {
      notification: {
       title: "Emergency Alert",
       body: "{sensData.keys} Pressure is High",
       badge: "1",
       sound: "defualt"
      }
  };
  admin.database().ref("FcmToken").once("value")
     .then(allToken => {
       if (allToken.val()) {
         console.log("token available");
         const token = Object.keys(allToken.val());
         return admin.messaging().sendToDevice(token, payLoad);
       } else {
         console.log("no token available");
       }
     });
   }
});

1 Ответ

1 голос
/ 17 марта 2019

1 / Вы неправильно возвращаете обещание, возвращенное асинхронным методом once().

2 / В следующих строках также есть ошибка:

  console.log(evnt.after.val);
  const sensData = evnt.after.val;

Должно быть:

  console.log(evnt.after.val());
  const sensData = evnt.after.val();

, поскольку val() является методом

3 / Наконец следует учитывать случай, когда статус <= 71. </p>

Поэтому вы должны адаптировать свой код следующим образом:

 exports.pressureExceeding = functions.database.ref("Reservoir/{id}")
.onUpdate(evnt => {
  console.log(evnt.after.val);
  const sensData = evnt.after.val;
  const status = sensData.sensor3;
  console.log(evnt.after.val);
  if (status > 71) {
    const payLoad = {
      notification: {
       title: "Emergency Alert",
       body: "{sensData.keys} Pressure is High",
       badge: "1",
       sound: "defualt"  // <- Typo
      }
  };

  //What happens if status <= 71?? You should manage this case, as you are using payload below.

  return admin.database().ref("FcmToken").once("value"). // <- Here return the promise returned by the once() method, then you chain the promises
     .then(allToken => {
       if (allToken.val()) {
         console.log("token available");
         const token = Object.keys(allToken.val());
         return admin.messaging().sendToDevice(token, payLoad);
       } else {
         console.log("no token available");
         return null;   // <- Here return a value
       }
     });
   }
});

Последнее замечание: вы используете старый синтаксис для версий <1.0. Вам, вероятно, следует обновить версию облачной функции (и адаптировать синтаксис). Посмотрите на следующий документ: <a href="https://firebase.google.com/docs/functions/beta-v1-diff" rel="nofollow noreferrer">https://firebase.google.com/docs/functions/beta-v1-diff

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