База данных Firebase в реальном времени удаляет старые данные и заменяет их - PullRequest
0 голосов
/ 03 мая 2020

Я хочу добавить новые данные в мою базу данных в реальном времени. Однако база данных удаляет старые данные и записывает новые данные. Моя схема данных такая:

enter image description here

И я хочу добавить нового пользователя в комнаты / roomid / users /

Мой код часть:

joinRoom = async (callback = f => f, roomId) => {
        
        currentRoomUid = roomId
        var username = ''
        await database().ref(`/users/${auth().currentUser.uid}`).once('value', function (snap) {
            username = snap.val().username
        })

        const room = database().ref(`/rooms/${roomId}`);
        await room.set({
            isStart: true,
            currentQuestionIndex: 0
        });

        const usersRef = database().ref(`/rooms/${roomId}/users`)
        usersRef.child(auth().currentUser.uid).set({
            username: username,
            skor: 0
        });

        callback(roomId)
    }

Здесь важно добавить пользователя. Я использую метод set. Как я могу это исправить? Я хочу добавить второго пользователя.

Проблема

Старые данные

enter image description here

После добавления операции

enter image description here

Ответы [ 2 ]

2 голосов
/ 03 мая 2020

Обновите после ваших комментариев:

Если вы хотите добавить разные users в узле rooms/423c34.../users, вам нужно передать разные значения методу child(). Например:

        const usersRef = database().ref(`/rooms/${roomId}/users`)
        await usersRef.child('userKey1').set({  
            username: username1,
            skor: 0
        });

        await usersRef.child('userKey2').set({   
            username: username2,
            skor: 0
        });

Если я правильно понимаю ваш вопрос, вам помогут следующие приспособления:

joinRoom = async (callback = f => f, roomId) => {

        currentRoomUid = roomId
        var username = ''
        const snap = await database().ref(`/users/${auth().currentUser.uid}`).once('value');
        const username = snap.val().username;

        const room = database().ref(`/rooms/${roomId}`);
        await room.set({
            isStart: true,
            currentQuestionIndex: 0
        });

        const usersRef = database().ref(`/rooms/${roomId}/users`)
        await usersRef.child(auth().currentUser.uid).set({   //Note the await here
            username: username,
            skor: 0
        });

        callback(roomId)
    }

Обратите внимание, что вы не await последний вызов метода set(), поэтому, скорее всего, обратный вызов был выполнен до того, как новый пользователь был сохранен в базе данных.


Обратите внимание, что вы можете использовать update() метод «одновременного обновления нескольких местоположений в дереве JSON одним вызовом».

1 голос
/ 03 мая 2020

.set () метод удалит ваши старые данные и создаст новые данные. поэтому, когда вы используете room.set, вы удаляете все в комнате. это включает пользователей. поэтому каждый раз, когда пользователь входит в комнату, он удаляет предыдущего пользователя и добавляет себя вместо этого. Вы должны использовать room.update следующим образом:

const room = database().ref(`/rooms/${roomId}`);
    await room.update({
        isStart: true,
        currentQuestionIndex: 0
    });

, если вы хотите лучше узнать разницу между установкой и обновлением, прочитайте ответ на этот вопрос: Обновление Firebase против набора

вот полный код, который вы должны использовать:

joinRoom = asyn c (callback = f => f, roomId) => {

    currentRoomUid = roomId
    var username = ''
    await database().ref(`/users/${auth().currentUser.uid}`).once('value', function (snap) {
        username = snap.val().username
    })

    const room = database().ref(`/rooms/${roomId}`);
    await room.update({
        isStart: true,
        currentQuestionIndex: 0
    });

    const usersRef = database().ref(`/rooms/${roomId}/users`)
    usersRef.child(auth().currentUser.uid).set({
        username: username,
        skor: 0
    });

    callback(roomId)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...