Невозможно отправить уведомления с использованием функций Firebase после обновления - PullRequest
0 голосов
/ 28 августа 2018

Итак, сегодня я обновил firebase cli и после этого развернул новую функцию. Хотя журнал Firebase показывает, что уведомления были отправлены на это множество токенов, уведомление не происходит. Ошибка показывает в журнале

Функция вернула неопределенное, ожидаемое обещание или значение

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

TypeError: Невозможно прочитать свойство 'description' из null

и теперь неожиданно показывается функция, возвращенная как неопределенная.

Не уверен, что не так. Любая помощь приветствуется.

index.js

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();


function token_send(admin,title_input,body_input,getBody,getDeviceTokensPromise,change){

  // Only edit data when it is first created.
  if (change.before.val()) {
    return 0;
  }

  // Exit when the data is deleted.
  if (!change.after.val()) {
    return 0;
  }



return Promise.all([getDeviceTokensPromise,getBody]).then(results => {
  const tokensSnapshot = results[0];
  const notify=results[1];

  if (!tokensSnapshot.hasChildren()) {
    return console.log('There are no notification tokens to send to.');
  }
  console.log('There are', tokensSnapshot.numChildren(), 'tokens to send notifications to.');
  var contentAlert = change.after.val();

  // Notification details.
  const payload = {
    'data': {
      'title': title_input,
      'body': body_input

    }

  };


const tokens = Object.keys(tokensSnapshot.val());



  // Send notifications to all tokens.
  return admin.messaging().sendToDevice(tokens, payload).then(response => {
    console.log("Successfully sent message:", response);
     console.log("content alert",contentAlert);
    // For each message check if there was an error.
    const tokensToRemove = [];
    response.results.forEach((result, index) => {
      const error = result.error;

      if (error) {
        console.error('Failure sending notification to', tokens[index], error);
        // Cleanup the tokens who are not registered anymore.
        if (error.code === 'messaging/invalid-registration-token' ||
            error.code === 'messaging/registration-token-not-registered') {
          tokensToRemove.push(tokensSnapshot.ref.child(tokens[index]).remove());
        }
      }
    });

    return Promise.all(tokensToRemove);
  });

});
}




exports.sendNotificationCouncil = functions.database.ref(`path/Post/{pushId}`).onWrite((change,context) => {
const getDeviceTokensPromise = admin.database().ref(`/Token/token_no`).once('value');
  const getBody=admin.database().ref(`/Post`).once('value');
  var title_input='You have new Post';
  var contentAlert = change.after.val();
  var body_input=contentAlert.description; //showing error here
  token_send(admin,title_input,body_input,getBody,getDeviceTokensPromise,change);
  });

Screenshot of the console

1 Ответ

0 голосов
/ 28 августа 2018

Вы должны вернуть обещание (возвращаемое token_send()) в облачной функции sendNotificationCouncil следующим образом:

exports.sendNotificationCouncil = functions.database.ref(`path/Post/{pushId}`).onWrite((change,context) => {
  const getDeviceTokensPromise = admin.database().ref(`/Token/token_no`).once('value');
  const getBody=admin.database().ref(`/Post`).once('value');
  var title_input='You have new Post';
  var contentAlert = change.after.val();
  var body_input=contentAlert.description; //showing error here

  return token_send(admin,title_input,body_input,getBody,getDeviceTokensPromise,change);
});

Обратите внимание, что также рекомендуется отлавливать ошибки в вашей функции и в этом случае возвращать false.

...