Firebase:更新或创建

x759pob2  于 2023-02-25  发布在  其他
关注(0)|答案(4)|浏览(140)

我正在使用Firebase和Node。
如果由于某种原因对象不存在,我想使用相同的方法来更新或创建对象。
请考虑以下方法

const firebaseSave = async function(data) {   
    const uid = firebase.auth().currentUser.uid

    const profilePath = `users/${uid}`
    const profileData = {
      name: data.name,
    }

    const userRef = firebaseDb.child(profilePath)
    await userRef.set(profileData)

  }

确定应该调用update还是set的最佳和正确方法是什么?
谢谢

nqwrtyyt

nqwrtyyt1#

基本上是:
“set”将数据写入或替换到定义的路径,如messages/users/
,您可以更新信息或创建信息。
看看这个:https://firebase.google.com/docs/database/admin/save-data

iqxoj9l9

iqxoj9l92#

我会说获取数据,检查是否有什么东西,如果没有默认为空的对象-然后更新该对象。
比如:

const valueSnapshot = await userRef.once('value');
const userValue = valueShapshot.exists() ? valueShapshot.val() : {};
const profileData = { ...userValue, name: data.name };
await userRef.set(profileData);

也就是说,假设您希望保留现有数据,并将任何新数据合并到其中,如果您不关心覆盖任何内容,则根本不需要检查。

raogr8fs

raogr8fs3#

这是我的想法,我把它应用到前端。
我使用id来标识我们是否应该创建或更新。
因为在前端,新数据通常没有任何id。
这样我们就不用检查单据是否存在了。
我不知道后端,但在前端是可以的。

createOrUpdateTemplate(template: Label): Observable<unknown> {
    if (!template.id) {
      return from(
        this.fs.collection<Label>('templates').add({
          ...template,
          createdAt: firebase.default.firestore.FieldValue.serverTimestamp(),
          updatedAt: firebase.default.firestore.FieldValue.serverTimestamp(),
        })
      );
    } else {
      return from(
        this.fs
          .collection<Label>('templates')
          .doc(template.id)
          .update({
            ...template,
            updatedAt: firebase.default.firestore.FieldValue.serverTimestamp(),
          })
      );
    }
  }
n9vozmp4

n9vozmp44#

await userRef.set(profileData, {merge: true})
您可以添加{merge:true},它将更新以前的文档,如果文档不存在,则创建新文档。

相关问题