Облачная функция Firebase - возвращает неопределенное, ожидаемое обещание или значение - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь отправить уведомление пользователю, но по какой-то причине у меня ошибка.Ошибка: «Функция вернула неопределенное, ожидаемое обещание или значение».

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

КОД

exports.sendNotification = functions.database.ref('/likes/{videoId}/{currentUser}').onWrite(event =>{
  console.log("Start send like notification");
  const model = event.data.val();
  let ownerVideoUserId = model.userVideoID;
  let username = model.userName;

  if(username == ""){
    username = "Somebody";
  }

  console.log("model notifi: ",model);
  console.log("userVideoID notifi: ",ownerVideoUserId);
  console.log("username notifi: ",username);

  let reference = admin.database().ref("/users/" + ownerVideoUserId);
        reference.once('value').then(snap => {
            //get the token
    let token = snap.child('token').val();
    console.log("user token: ",token);


  const payload = {
    data: {
      title: "Talent",
      message: username + " liked your video",
    }
  }

  return admin.messaging().sendToDevice(token,payload).then(function(res){
    console.log("Successfully sent message:", res);

  }).catch(function(error) {
    console.log("Error sending message:", error);
    });

   })
});

Можете ли вы заметить мою ошибку?

РЕДАКТИРОВАТЬ exports.sendCommentNotification = functions.database.ref ('genresComments / {genre}/ndomvideoId‹/ndomuserIdcasts').onWrite(event => {console.log («Начать отправку уведомления о комментариях»); const model = event.data.val (); let ownerVideoUserId = model.ownerVideoID; let username =model.userName;

    if(username == "")
      username = "Somebody";


    console.log("model: ",model);
    console.log("userVideoID: ",ownerVideoUserId);
    console.log("username: ",username);

      let reference = admin.database().ref("/users/" + ownerVideoUserId);
    return reference.once('value').then(snap => {
      //get the token
      let token = snap.child('token').val();
      console.log("user token: ",token);


    const payload = {
      data: {
        title: "Talent",
        message: username + " comment your post",
      }
    }

    return admin.messaging().sendToDevice(token,payload).then(function(res){
      console.log("Successfully sent message:", res);

    }).catch(function(error) {
      console.log("Error sending message:", error);
      });

   }).catch(function(error){
     console.log("Error with the reference:",error);

   }).then(()=>{
    console.log('notification');
  });
 });

Ответы [ 2 ]

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

Как подсказывает сообщение об ошибке, вы ничего не возвращаете из функции родительского уровня ... что является проблемой для облачных функций.Если вы собираетесь вызывать асинхронный код, такой как метод ref.once('value'), вам нужно вернуть его.

exports.sendNotification = functions.database.ref('/likes/{videoId}/{currentUser}').onWrite(event =>{
    console.log("Start send like notification");
    const model = event.data.val();
    let ownerVideoUserId = model.userVideoID;
    let username = model.userName;

    if(username == ""){
        username = "Somebody";
    }

    console.log("model notifi: ",model);
    console.log("userVideoID notifi: ",ownerVideoUserId);
    console.log("username notifi: ",username);

    let reference = admin.database().ref("/users/" + ownerVideoUserId);

    return reference.once('value').then(snap => {      // <----- RETURN NEEDED HERE
        //get the token
        let token = snap.child('token').val();
        console.log("user token: ",token);

        const payload = {
            data: {
                title: "Talent",
                message: username + " liked your video",
            }
        }

        return admin.messaging().sendToDevice(token,payload).then(function(res){
            console.log("Successfully sent message:", res);
        }).catch(function(error) {
            console.log("Error sending message:", error);
        });

    })
});

РЕДАКТИРОВАТЬ:

Определенно рекомендую вам посмотреть серию видео, которую Рено рекомендует в своем ответе.Там очень хорошие объяснения.

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

Как вы увидите в трех видео от Дуга Стивенсона о «Обещаниях JavaScript» из серии видеороликов Firebase (https://firebase.google.com/docs/functions/video-series/), вы ДОЛЖНЫ вернуть Promise или значение в своей облачной функции, чтобы указать платформе, чтоон завершен.

Итак, в вашем случае вы можете сделать следующее (если вас не волнует ведение журнала консоли):

exports.sendNotification = functions.database.ref('/likes/{videoId}/{currentUser}').onWrite(event =>{
  ....

  let reference = admin.database().ref("/users/" + ownerVideoUserId);
  return reference.once('value')
  .then(snap => {
     ...
     return admin.messaging().sendToDevice(token,payload);
  });
});

или, если хотите сохранитьзапись в консоль:

...
  let reference = admin.database().ref("/users/" + ownerVideoUserId);

  return reference.once('value')
  .then(snap => {
  return admin.messaging().sendToDevice(token,payload);
  .then(function(res){
    console.log("Successfully sent message:", res);
    return null;
  })
  .catch(function(error) {
    console.log("Error sending message:", error);
    return null;
  });
...
...