FieldValue.arrayUnion()调用了无效数据。 FieldValue.serverTimestamp()只能与update()和set()一起使用。

12
addDeposit(account, deposit) {

    let depositsDoc = this.db.collection("accounts")
                      .doc(account.id)
                      .collection("deposits")
                      .doc("deposits");

    return new Promise((resolve, reject) => {

      deposit.created_at = firebase.firestore.FieldValue.serverTimestamp();

      depositsDoc.update({
        "deposits": firebase.firestore.FieldValue.arrayUnion(deposit)
      })
        .then((a) => {
           resolve('success');
        })
        .catch((error) => {
          reject("failed");
        });

    })
      .then((res) => {
        return res;
      })
      .catch((error) => {
        return error;
      })

    }

**使用默认的Firebase SDK而不是AngularFire与Angular一起使用Firestore**

我尝试通过直接添加“created_at”属性调用时间戳来向存款对象添加时间戳。这样做会导致上述错误。 在Firestore的对象数组中如何为对象添加时间戳?

3个回答

17

1
真是救命稻草啊。我不明白为什么这不是被采纳的答案! - Aviale
7
除非您在云函数中使用此代码且与Firestore位于同一区域(以匹配服务器和函数时区),否则本答案不应被接受。Timestamp.now()是客户端数据,因此可以被黑客篡改。如果代码在客户端运行,则ServerTimestamp()是唯一安全的方式。 - Ignacio Bustos
1
@IgnacioBustos是正确的。这不是一种“安全”的生成时间戳的方式,因为客户端应用程序实际上可以提供任何它想要的时间戳值,而不是特定的服务器时间戳。真正的服务器时间戳只能在服务器上通过文档写入计算得出,其中serverTimestamp()令牌被提供作为字段值(而不是数组元素)。 - Doug Stevenson

13

您不能将FieldValue.serverTimestamp()用作文档字段的数组类型值的联合(添加)或删除、到或从。如果您想使用该时间戳值,您需要直接将其传递给您正在更新或设置的字段。这对于FieldValue类中的所有内容都是如此。这个类别名是有原因的 - 它仅适用于字段值,而不是数组元素。请注意,嵌套映射字段算作字段值。路径中任何涉及数组的部分均无法实现。

您需要考虑另一种满足您的需求并同时符合Firestore要求的数据结构方式。


只是为了确认一下,您不能直接在数组值中使用serverTimestamp,也不能在添加到数组的对象字段中使用它,对吗?我的用例是一个信息点数组,我想为更新时刻添加一个时间戳。 - lujop
@lujop 我不完全确定你在问什么,但服务器时间戳只能在添加为字段值时起作用。它不能作为数组的元素,但可以作为嵌套映射字段值使用。 - Doug Stevenson
谢谢Doug,这正是我的用例,我试图在使用arrayUnion添加到数组的对象的字段值中使用。现在您的编辑使我清楚,如果涉及数组,则不可能实现。 - lujop

1
根据这个页面: https://github.com/invertase/react-native-firebase/issues/1831 目前还不支持。
但是如果你不是真的需要firebase服务器的时间,你可以使用经典的Date对象。
const formattedDate = data.creation_date.toDate().toLocaleDateString('fr-FR', {year:'numeric' ,month:'long' ,day:'numeric'});

query_document = <Define your document with FIREBASE>

await updateDoc(query_document, {
update_time: arrayUnion(formattedDate)
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接