# #javascript #firebase-realtime-database #react-native-firebase
Вопрос:
Я использую react-native-firebase в удаленном приложении expo и пытаюсь создать систему обнаружения присутствия в своем приложении для чата, которая определит, находится ли получатель сообщения в Сети, и если нет, то когда он/она в последний раз был в Сети. Данные будут храниться следующим образом в базе данных firebase в реальном времени:
{
lastSeen:[{
[userId]:{
state: boolean
time: serverTimeStamp
}
}]
}
Проблема в том, что консоль firebase никогда не показывает данные, и только если получатель находится в Сети, приложение показывает эти данные (даже если они не видны в консоли), но если пользователь находится в автономном режиме, то ничего не возвращается и не генерируется ошибка. Я установил для чтения и записи значение true в правилах realtimeDB. Вот код, который я использую:
import database from "@react-native-firebase/database";
export const updateUserLastSeen = (userId) => {
const userStatusDatabaseRef = database().ref("/lastSeen/" userId);
console.log("updatelast", userId);
userStatusDatabaseRef
.set({
state: true,
time: database.ServerValue.TIMESTAMP,
})
.then(() => console.log("online"))
.catch((e) => console.log(e));
// database()
// .ref(".info/connected")
// .on("value", function (snapshot) {
// if (snapshot.val() == false) {
// return;
// }
userStatusDatabaseRef
.onDisconnect()
.set({
state: false,
time: database.ServerValue.TIMESTAMP,
})
.then(function () {
console.log("disconnect configured");
// userStatusDatabaseRef.set({
// state: true,
// time: database.ServerValue.TIMESTAMP,
// });
});
// });
};
export const checkUserLastSeen = (userId, setUserLastSeen) => {
console.log("check last", userId);
database()
.ref("/lastSeen/" userId)
.on("value", (snapshot) => {
setUserLastSeen(snapshot.val());
console.log("User data: ", snapshot.val());
});
console.log("after check last");
};
Я попробовал как код из документов firebase, так и документы rnfirebase. В приведенном выше коде ни одна из функций «затем» или «поймать» не вызывается в updateUserLastSeen, но в checkUserLastSeen «включено» вызывается только в том случае, если носитель идентификатора пользователя находится в сети. Кроме того, я использую базу данных в реальном времени только для этой цели, а cloud firestore-для хранения других данных, и он работает нормально.
Любая помощь будет признательна. Спасибо.
Комментарии:
1. Если
then
не вызывается ни илиcatch
записи, это обычно означает, что клиент не подключен к серверу. Вы уверены, что у вас есть сетевое подключение? И что вы настроили (правильный) URL-адрес для своей базы данных?2. @FrankvanPuffelen забыл обновить файл служб Google, глупый я. Хотя чего я не понимаю, так это почему он смог получить результат ранее, когда носитель идентификатора пользователя был в Сети. В любом случае спасибо за помощь, очень признателен.
3. Приятно слышать. Я написал это в ответе, так как мы действительно иногда видим это там, где люди не понимают пути устранения неполадок.
Ответ №1:
Если then
не вызывается ни или catch
записи, это обычно означает, что клиент не подключен к серверу.
Я рекомендую проверить, чтобы убедиться, что у вашего приложения есть сетевое подключение и что вы настроили (правильный) URL-адрес для своей базы данных.