Если я правильно понимаю вашу проблему («похоже, функция не ожидает 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.