Ошибка в обещаниях Javascript при попытке создать функцию в Firebase FireStore

поэтому я следил за этой серией руководств из 5 частей о том, как уведомления могут быть отправлены с устройства на устройство с помощью облачного хранилища Firebase, и написанный мной javascript кажется неправильным, потому что я продолжаю получать сообщение об ошибке «Каждый 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.info("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.info("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.info("Notification Sent");
      });
    });
  });
});

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

32:18 error Parsing error: Unexpected token default

Вторая проблема ... default - это зарезервированное слово в javascript (и все равно не определено в вашем коде)

Jaromanda X 27.09.2018 03:02

первая «проблема» (предупреждение, я подумал) - console.info("Notification Sent"); не имеет возврата в этом .then

Jaromanda X 27.09.2018 03:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
136
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Ответ принят как подходящий

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

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

Вот и виноват:

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

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

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

.then(result => {
    return console.info("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.info("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.info("Notification Sent");
    });
});

Вышеуказанных ошибок сейчас не возникает. Но помимо этого появляется ошибка «Ошибка синтаксического анализа: неожиданный токен по умолчанию». Что для этого нужно сделать?

Panchali Nanayakkara 27.09.2018 07:25

верно ... так что же ты думает о default ... что это значит для вас в этом коде? поскольку у вас не может быть переменной с именем default, должна ли она быть "default", как я сделал в ответе?

Jaromanda X 27.09.2018 07:32

Другие вопросы по теме