Ошибка в обещаниях Javascript при попытке создать функцию в Firebase FireStore - PullRequest
0 голосов
/ 27 сентября 2018

, поэтому я следил за этой серией из пяти частей, как отправлять уведомления с устройства на устройство с помощью облачного хранилища Firebase, а написанный мной javascript кажется неверным, потому что я продолжаю получать сообщение об ошибке «Each then ()»должен вернуть значение или бросить обещание / всегда возвращать ".Может кто-нибудь сказать мне, как я должен исправить это?

index.js

'use-strict'

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

exports.sendNotification = functions.firestore.document("Users/{user_id}/Notifications/{notification_id}").onWrite((event) => {

  var user_id = event.params.user_id;
  var notification_id = event.params.notification_id;

  //console.log("User ID: " + user_id + " | Notification ID : " + notification_id);

  return admin.firestore().collection("Users").doc(user_id).collection("Notifications").doc(notification_id).get().then(queryResult => {
    var from_user_id = queryResult.data().from;
    var from_message = queryResult.data().message;

    var from_data = admin.firestore().collection("").doc("from_user_id").get();
    var to_data = admin.firestore().collection("Users").doc(user_id).get();

    return Promise.all([from_data, to_data]).then(result => {
      var from_name = result[0].data().name;
      var to_name = result[1].data().name;
      var token_id = result[1].data().token_id;

      console.log("From: " + from_name + " | To : " + to_name);

      var payload = {
        notification : {
          title : "Notification From : " + from_name,
          body : from_message,
          icon : default
        }
      };

      return admin.messaging().sendToDevice(token_id, payload).then(result => {
        console.log("Notification Sent");
      });
    });
  });
});

Помимо вышеупомянутой ошибки, я также получаю ошибку "синтаксического анализа", какследует

32:18 error Parsing error: Unexpected token default

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

"Каждое then () должно возвращать значение или выдавать обещание / всегда возвращать"

Это указывает на то, что один из ваших .then не возвращает значение (или выведите ошибку)

Вот виновник:

.then(result => {
    console.log("Notification Sent");
});

Так что добавьте return.Теперь, поскольку console.log возвращаемое значение равно undefined, а в функции, не имеющей оператора return, подразумевается return undefined

Поэтому приведенный ниже код приводит к точно такому же поведению (то есть return undefined), ипредотвратит это предупреждающее сообщение

.then(result => {
    return console.log("Notification Sent");
});

Что касается вашей ошибки относительно default, то это просто потому, что default является зарезервированным словом в javascript (и оно даже не объявлено в вашем коде в любом случае) - это какпытаюсь использовать if или while в качестве имени переменной


Еще одна потенциальная проблема, которую я вижу в вашем коде:

var from_user_id = queryResult.data().from;
var from_message = queryResult.data().message;

//***                                                vvvvvvvvvvvvvv
var from_data = admin.firestore().collection("").doc("from_user_id").get();
var to_data = admin.firestore().collection("Users").doc(user_id).get();

Если это .doc(from_user_id) - в противном случае,в чем смысл var from_user_id = queryResult.data().from;


И, наконец, в стороне, я вижу, что вы вкладываете свои обещания, а не цепляете их.Одним из преимуществ обещаний является то, что вы можете избежать "пирамиды обратного вызова ада / гибели"

Ваш код может быть написан как ниже вместо этого, что позволяет избежать "пирамиды" -Есть также некоторые другие приемы ES6 / ES7 +, так что queryResult.data() и to_data.data() нужно вызывать только один раз

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

exports.sendNotification = functions.firestore.document("Users/{user_id}/Notifications/{notification_id}").onWrite((event) => {

    const user_id = event.params.user_id;
    const notification_id = event.params.notification_id;

    return admin.firestore().collection("Users").doc(user_id).collection("Notifications").doc(notification_id).get()
    .then(queryResult => {
        const {from:from_user_id, message:from_message} = queryResult.data();

        const from_data = admin.firestore().collection("").doc(from_user_id).get();
        const to_data = admin.firestore().collection("Users").doc(user_id).get();

        return Promise.all([from_data, to_data, from_message]); // added from_message so it's available in the next .then
    })
    .then(([from_data, to_data, from_message]) => { // added from_message
        const from_name = from_data.data().name;
        const {name:to_name, token_id} = to_data.data();

        console.log("From: " + from_name + " | To : " + to_name);

        const payload = {
            notification : {
                title : "Notification From : " + from_name,
                body : from_message,
                icon : 'default'
            }
        };

        return admin.messaging().sendToDevice(token_id, payload);
    })
    .then(result => {
        return console.log("Notification Sent");
    });
});
0 голосов
/ 27 сентября 2018

Вы используете зарезервированное ключевое слово default, которое вы не можете использовать.Я полагаю, вы хотели представить это как строку, например "default"

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