Firebase обновляет только заданные поля

#typescript #firebase #google-cloud-firestore

#typescript #firebase #google-облако-firestore

Вопрос:

В моем firestore у меня есть несколько документов, представляющих сообщения на форуме для проекта, который я разрабатываю с помощью функций firebase и typescript.

Структура firestore выглядит следующим образом:

 {
    forumPosts: {
        :forumPostId: {
        
            id: string,
            content: string,
            icon: string,
            ...
        
        }
    }
}
  

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

 {
    content: "updated content"
}
  

Функция firebase, которая в настоящее время обрабатывает обновление, выглядит следующим образом.

 export const updateNewForumPost=functions.https.onRequest((req: PR_UserRequest, res: Response) => {

    const fieldsToUpdate = {
        id: req.body.id,
        content: req.body.content,
        icon: req.body.icon,
        ...
    }

    db.collection("forumPosts").doc(req.params.postId).update( fieldsToUpdate )
        .then(() => {
            res.json({ message: `forum post ${req.params.postId} updated successfully` })
        })
        .catch((error) => res.json({ error }))

});
  

Поэтому я помещаю в объект «поля для обновления» каждое поле, имеющееся в forumPost, и неизбежно в запросе содержится много полей со старыми значениями, которые не нуждаются в обновлении.

Как я уже сказал, я пытаюсь найти способ поместить в этот объект только те поля, которые пользователь ввел в свой запрос. Есть идеи о том, как мне следует работать с этой проблемой?

Заранее спасибо.

Комментарии:

1. В чем проблема с кодом, которым вы поделились? Итак: когда вы просматриваете этот код в отладчике, какая строка не выполняет то, что вы ожидаете от нее?

2. Реальной проблемы нет. Дело в том, что в объекте post есть много полей, которые можно обновлять, например, содержимое, заголовок и многое другое. Если пользователь хочет обновить только одно из них, скажем, содержимое, я должен сделать запрос с обновленным содержимым, а все остальные поля — со старыми значениями. Для меня это очень сложно, особенно если объект большой, как в этом случае.

3. Вам fieldsToUpdate нужно только содержать поля, которые вы хотите обновить. Передача полей, которые не были изменены, — это просто пустая трата пропускной способности. Итак, как насчет добавления каждого поля fieldsToUpdate только после того, как вы узнаете, что пользователь изменил его значение?