Обновление массива с помощью облачной функции Firebase не отражается клиентом - PullRequest
0 голосов
/ 28 июня 2019

У меня есть приложение, в котором мне нужно удалить UID из массива. Поскольку пользователь не имеет права писать документ, я делаю обновление через облачную функцию. Моя облачная функция выглядит так:

async function deleteProjectUserKey(request): Promise<Responce> {
//console.log('deleteProjectUserKey() started');

try {
    const uid = request.body.uid;
    const projectKey = request.body.payload.projectKey;

    const snapshot = await firestore.doc(`/${projectsPath}/${projectKey}`).get();
    const project: Project = <Project>snapshot.data();

    let success = false;
    let idx = project.roUids.findIndex(_uid => _uid === uid);
    if (idx >= 0) {
        project.roUids.splice(idx, 1);
        await firestore.doc(`/${projectsPath}/${projectKey}`).update({ 'roUids': project.roUids });
        success = true;
    } else {
        idx = project.rwUids.findIndex(_uid => _uid === uid);
        if (idx >= 0) {
            project.rwUids.splice(idx, 1);
            await firestore.doc(`/${projectsPath}/${projectKey}`).update({ 'rwUids': project.rwUids });
            success = true;
        }
    }
    if (success) {
        return { status: 200, message: 'Successfully deleted project user key' };
    } else {
        return { status: 400, message: 'No souch project user key' };
    }
}
catch (error) {
    return { status: 400, message: error.message };
}

Это выглядит нормально, когда я смотрю в консоль после запуска функции:

enter image description here

Однако данные, которые я получаю, по-прежнему содержат удаленный UID: enter image description here

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

enter image description here

Функция чтения данных на стороне клиента выглядит следующим образом:

getProjects(uid?: string): Observable<Project[]> {
    const _uid = uid !== undefined ? uid : this.uid;
    const rwUids$ = <Observable<Project[]>>this.db.collection(`${projectsPath}`, ref => ref.where('rwUids', 'array-contains', _uid))
        .valueChanges();

    const roUids$ = <Observable<Project[]>>this.db.collection(`${projectsPath}`, ref => ref.where('roUids', 'array-contains', _uid))
        .valueChanges();

    return combineLatest(roUids$, rwUids$)
    .pipe(
        map(([roUids, rwUids]) => [...roUids, ...rwUids]),
        filter(projects => projects.length > 0),
        tap(projects => this.debug('getProjects() emitted', 'projects', projects, 'project', this.dbData.project)),
    );
}

Похоже, что обновление моего массива обновлением массива не отражается в моем приложении. Кто-нибудь может объяснить, почему?

EDIT: Я попытался изменить функцию облака в соответствии с предложением @Renaud Tarnec:

async function deleteProjectUserKey(request): Promise<Responce> {
    //console.log('deleteProjectUserKey() started');

    try {
        const uid = request.body.uid;
        const projectKey = request.body.payload.projectKey;
        const readOnlyArray = request.body.payload.readOnlyArray;

        if (readOnlyArray) {
            await firestore.doc(`/${projectsPath}/${projectKey}`).update({
                roUids: admin.firestore.FieldValue.arrayRemove(uid)
            });
        } else {
            await firestore.doc(`/${projectsPath}/${projectKey}`).update({
                rwUids: admin.firestore.FieldValue.arrayRemove(uid)
            });
        }

        return { status: 200, message: 'Successfully deleted project user key' };
    }
    catch (error) {
        return { status: 400, message: error.message };
    }
}

, но результат точно такой же, как и раньше: база данных firestore выглядит правильно, но возвращаемый массив неверен.

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