Firestore не показывает обновленный документ после обновления массива - PullRequest
2 голосов
/ 13 марта 2020

У меня есть облачная функция в Firebase, и она обновляет массив внутри документа, используя этот метод: https://firebase.google.com/docs/firestore/manage-data/add-data#update_elements_in_an_array

Однако, когда я пытаюсь получить обновленную версию документ, он показывает, что было до обновления массива. Вот мой код:

eventUpdated не показывает правильную версию перед обновлением массива.

if(isPut(request)){

    //All new additions
    const userId = request.body.userId;
    const eventId = request.body.eventId;
    const attStatus = request.body.attStatus;

    try {

        let eventsRef = db.collection('events').doc(eventId);

        if (attStatus === true) {
            // Add a new ID to the "eventAttendanceList" array field.
            let arrUnion = eventsRef.update({
                eventAttendanceList: admin.firestore.FieldValue.arrayUnion(userId)
            });
            // Remove a ID from the "eventNonAttendanceList" array field.
            let arrRm = eventsRef.update({
                eventNonAttendanceList: admin.firestore.FieldValue.arrayRemove(userId)
            });


        }
        else if (attStatus === false) {
            // Add a new ID to the "eventNonAttendanceList" array field.
            let arrUnion = eventsRef.update({
                eventNonAttendanceList: admin.firestore.FieldValue.arrayUnion(userId)
            });
            // Remove a ID from the "eventAttendanceList" array field.
            let arrRm = eventsRef.update({
                eventAttendanceList: admin.firestore.FieldValue.arrayRemove(userId)
            });

        }
        else {
            //If you do anything other than true or false, it will just remove the userId from both attending and non-attending
            let arrUnion = eventsRef.update({
                eventAttendanceList: admin.firestore.FieldValue.arrayRemove(userId)
            });
            let arrRm = eventsRef.update({
                eventNonAttendanceList: admin.firestore.FieldValue.arrayRemove(userId)
            });

        }

            let eventUpdated = await db.collection('events').doc(eventId).get()
            return response.status(200).json({status: "200", message: "Event RSVP successfully updated", event: eventUpdated.data()}).send;


    } catch(err) {
        return response.status(500).json({status: "500", message: "Event RSVP could not be updated"}).send;
    }

} else {
    return response.json({status: "ERR", message: "Please send a PUT request."}).send;
}

1 Ответ

2 голосов
/ 13 марта 2020

Вы вызываете набор асинхронных update() методов, но не ждете, пока они завершатся, прежде чем вызывать метод get() и отправлять ответ.

Таким образом, вы также должны использовать await для update() методов, как показано ниже:

let eventsRef = db.collection('events').doc(eventId);

if (attStatus === true) {
    // Add a new ID to the "eventAttendanceList" array field.
    await eventsRef.update({
        eventAttendanceList: admin.firestore.FieldValue.arrayUnion(userId)
    });
    // Remove a ID from the "eventNonAttendanceList" array field.
    await eventsRef.update({
        eventNonAttendanceList: admin.firestore.FieldValue.arrayRemove(userId)
    });
}
else if (attStatus === false) {
    //...
}
else {
    //...
}

let eventUpdated = await db.collection('events').doc(eventId).get()
response.status(200).json({ status: "200", message: "Event RSVP successfully updated", event: eventUpdated.data() }).send;

Я предполагаю, что вы используете HTTP Cloud Function . Обратите внимание, что вам не нужно делать return, просто позвоните response.redirect(), response.send() или response.end(). См. do c и соответствующее видео .


Также обратите внимание, что если вы вызываете несколько записей или обновлений документа подряд, вы можете использовать пакетная запись .

...