Функции Firebase - Возврат после извлечения базы данных в реальном времени внутри выборки пользователя - PullRequest
0 голосов
/ 10 июля 2019

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

Эта функция работает, но возвращает «ноль» и завершает работу раньше, чем возвращаетсообщение об успехе или ошибке при обнаружении совпадения.

Как сделать так, чтобы возвращаемый текст соответствовал успеху или ошибке совпадения и завершился только после того, как было решено совпадение?

exports.matchNumber = functions.https.onCall((data, context) => {
// ID String passed from the client.
const ID = data.ID;
const uid = context.auth.uid;

//Get user data
admin.auth().getUser(uid)
  .then(function(userRecord) {


    // Get a database reference to our posts
    var db = admin.database();
    var ref = db.ref("path/to/data/" + ID);

    return ref.on("value", function(snapshot) {

        //Fetch current phone number
        var phoneORStr = (snapshot.val() && snapshot.val().phone) || "";

        //Fetch the current auth user phone number
        var userAuthPhoneNumber = userRecord.toJSON().phoneNumber;

        //Check if they match
        if (userAuthPhoneNumber === phoneORStr) {
            console.log("Phone numbers match");

            var updateRef = db.ref("path/to/data/" + ID);
            updateRef.update({
              "userID": uid
            });
            return {text: "Success"};
        } else {
            console.log("Phone numbers DO NOT match");
            return {text: "Phone number does not match the one on record."};
        }
    }, function (errorObject) {
      console.log("The read failed: " + errorObject.code);
        return {text: "Error fetching current data."};
    });
  })
  .catch(function(error) {
    console.log('Error fetching user data:', error);
    return {text: "Error fetching data for authenticated user."};
  });
});

Спасибо

1 Ответ

1 голос
/ 10 июля 2019

Метод Firebase ref.on() не возвращает обещание, поэтому содержащиеся там операторы return ничего не делают.

Вы ищете ref.once(), который возвращает обещание, итаким образом, всплывет return высказываний, которые у вас есть:

return ref.once("value").then(function(snapshot) {
  ...

Как указал Дуг, вам также нужно будет вернуть обещание с верхнего уровня.Итак:

//Get user data
return admin.auth().getUser(uid)
  .then(function(userRecord) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...