У меня есть приложение, в котором мне нужно удалить 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 };
}
Это выглядит нормально, когда я смотрю в консоль после запуска функции:
Однако данные, которые я получаю, по-прежнему содержат удаленный UID:
После обновления браузера данные, которые я получаю, становятся правильными:
Функция чтения данных на стороне клиента выглядит следующим образом:
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 выглядит правильно, но возвращаемый массив неверен.