Дождитесь инициализации firebase.auth, прежде чем читать другую функцию - PullRequest
0 голосов
/ 06 января 2020

Я очень новый с Firebase и javascript.

Мой проект: Создание приложения для личных сообщений. Для этого я хочу определить подколлекцию в firestore для личных сообщений, используя текущий идентификатор пользователя и идентификатор конечного пользователя.

Вот функция, которая позволяет это:

// generate the right SubCollection depending on current User and the User he tries to reach
function dmCollection(toUid) {

  if (toUid === null) {
    // If no destination user is definer, we set it to the below value
    toUid = 'fixed_value';
  };
  const idPair = [firebase.auth().currentUser.uid, toUid].join('_').sort();
  return firebase.firestore().collection('dms').doc(idPair).collection('messages');
};

Моя проблема: Я хочу использовать атрибут firebase.auth().currentUser.uid, но похоже, что функция не ожидает инициализации firebase.auth. Как я могу решить эту проблему?

Дополнительная информация: У меня есть две функции, которые вызывают первую (dmCollection):


// retrieve DMs
function messagesWith(uid) {
  return dmCollection(uid).orderBy('sent', 'desc').get();
};


// send a DM
function sendDM(toUid, messageText) {
  return dmCollection(toUid).add({
    from: firebase.auth().currentUser.uid,
    text: messageText,
    sent: firebase.firestore.FieldValue.serverTimestamp(),
  });
};

1 Ответ

2 голосов
/ 06 января 2020

Если я правильно понимаю вашу проблему («похоже, функция не ожидает firebase.auth инициализация»), у вас есть два возможных решения:

Решение 1: Установите наблюдателя на Auth объект

Как объясняется в документации , вы можете установить наблюдателя для объекта Auth с помощью метода onAuthStateChanged():

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

Таким образом, вы изменили бы свой код как следующим образом:

// retrieve DMs
function messagesWith(uid) {
  return dmCollection(uid).orderBy('sent', 'desc').get();
};


// send a DM
function sendDM(toUid, messageText) {
  return dmCollection(toUid).add({
    from: firebase.auth().currentUser.uid,
    text: messageText,
    sent: firebase.firestore.FieldValue.serverTimestamp(),
  });
};

// generate the right SubCollection depending on current User and the User he tries to reach
function dmCollection(toUid) {

  if (toUid === null) {
    // If no destination user is definer, we set it to the below value
    toUid = 'fixed_value';
  };
  const idPair = [firebase.auth().currentUser.uid, toUid].join('_').sort();
  return firebase.firestore().collection('dms').doc(idPair).collection('messages');
};


firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    var messageText = '....';
    sendDM(user.uid, messageText)
  } else {
    // No user is signed in.
  }
});

Решение 2: Использовать свойство currentUser

Вы также можете «получить текущего вошедшего в систему пользователя, используя currentUser свойство ", как объяснено в том же do c. «Если пользователь не вошел в систему, currentUser является нулевым».

В этом случае вы должны сделать:

var user = firebase.auth().currentUser;

if (user) {
  var messageText = '....';
  sendDM(user.uid, messageText);
} else {
  // No user is signed in.
  // Ask the user to sign in, e.g. redirect to a sign in page
}

Какое решение выбрать?

Зависит от того, как вы хотите вызывать функцию (и) в зависимости от пользователя uid.

  • Если вы хотите вызывать функцию (и) сразу после входа в систему, используйте Решение 1.
  • Если вы хотите вызвать функцию (и) по другому c момент (например, после действия пользователя), используйте Решение 2.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...