Функция Firebase возвращает нулевой объект данных

У меня есть облачная функция Firebase, которая работает (она записывает в мою базу данных от имени администратора, а также проверяет существующую запись с идентификатором строки электронной почты). Моя проблема в том, что он не возвращает данные обратно в клиентское приложение должным образом.

Когда я отслеживаю значение result, это {data: null}

Я также хотел бы выдать ошибку, если электронное письмо существует, но оно жалуется на необработанное обещание (см. комментарии в коде ниже).

Итак, здесь есть два вопроса. Первая из них самая насущная.

exports.saveData = functions.https.onCall( (data, context) => {

    // check if the email exists
    admin.database().ref('competition_entries/' + data.compId + '/' + data.emailStringId).once('value').then(function(snapshot) {
        if (snapshot.val() == null){

          console.info("Writing data to "+data.compId+" : "+data.emailStringId);

          let current_datetime = new Date()
          let formatted_time = current_datetime.getHours() + ":" + current_datetime.getMinutes() + ":" + current_datetime.getSeconds();
          let formatted_date = current_datetime.getDate() + "/" + (current_datetime.getMonth() + 1) + "/" + current_datetime.getFullYear();
          let timestamp_string = formatted_time+" "+formatted_date;
          console.info(formatted_date)

          admin.database().ref('competition_entries/' + data.compId + '/' + data.emailStringId).set({
            name: data.name,
            email: data.email,
            phone: data.phone,
            selectedItem: data.selectedItem,
            submitted_date: timestamp_string
          })
          .then(() => {
            console.info("success");
            return {
              "error": "none",
              "message": "success"
            };
          }).catch(function(error) {
            throw error;
          });

        }else{
            // email address exists as a data entry so tell the user that they have already submitted
            let code = "already-exists";
            let message = "Email address already exists";
            let details = "A user with the same email address has already entered the competition.";
            console.info(message+"/"+details);

            /*
              TODO: throwing an HttpsError directly here was causing an unresolved promise error. This would be the better way to tell the client that the user has already submitted their data.
            */
            // throw error;
            //throw new functions.https.HttpsError(code, message, details);

            // this resolves the promise error but is a hack
            return {
              error: new functions.https.HttpsError(code, message, details),
              message: message
            }
        }
    }).catch(function(error) {
      throw error;
    });
});
Поведение ключевого слова "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) для оценки ваших знаний,...
1
0
491
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

Обычно это return true или return Promise

Так что это должно быть что-то вроде этого:

//check if email exist
return admin.databse...

    //If there is no user create it
     return.admin...

Код записывает базу данных, но так как это не было возвратом, это происходило асинхронно, и код продолжал выполняться сверху вниз, делая функцию ответа клиенту тарабарщиной.

Вам следует

  • if (!snapshot) короткое замыкание лучше, потому что снимок может быть неопределенным, вызывая исключение при проверке, если данные снимка пусты.
  • Вам не нужно использовать admin sdk для базы данных, функции считаются доверенной средой, поэтому операции выполняются с правами администратора. Вы можете CRUD что угодно, несмотря на правила или ограничения пользователя

Я только что узнал о добавлении «возврата», но спасибо и за другие советы! Ценить это.

Lee Probert 29.05.2019 17:38

Моя проблема сейчас в том, что я развернул его и получил проблему CORS. Какие-нибудь советы?

Lee Probert 29.05.2019 17:39

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