Firebase push()函数抛出.child()不是函数错误

时间:2020-06-11 05:42:35

标签: reactjs firebase react-native firebase-realtime-database google-cloud-firestore

我刚开始使用Firebase。我正在寻找一种将数据推送到Firebase Firestore中的列表的方法。

我想要的结果如下图所示。当有新事务时,我需要使用新ID将其推送到“ packageTransactions”。我在文档中读到ID可以自动生成,并且是从时间戳派生的。这对我来说是完美的,因为订购很容易。 Desired Outcome

我尝试通过两种方式实现这一目标;

方法1:

return firebase.firestore()
    .collection('packages')
    .doc(`${parcelId}`)
    .child("packageTransactions")
    .push()
    .set({"userId": user.uid, "transactionTime": moment().format("YYYY-MM-DD HH:mm:ss")})

这会产生错误:

[未处理的承诺被拒绝:TypeError:firebase.firestore()。collection('packages')。doc(“” + parcelId).child不是函数。 (在'firebase.firestore()。collection('packages')。doc(“” + parcelId).child(“ packageTransactions”)','firebase.firestore()。collection('packages')。doc(“” + parcelId).child'未定义)]

方法2:

var db= firebase.firestore();
var ref = db.ref(`packages/${parcelId}/`);
var transactRef = ref.child("packageTransactions");

transactRef.push().set({
  "userId": user.uid, 
  "transactionTime": moment().format("YYYY-MM-DD HH:mm:ss")
})

这会产生错误:*

[未处理的承诺被拒绝:TypeError:db.ref不是一个函数。 (在'db.ref(“ packages /” + parcelId +“ /”)'中,'db.ref'未定义)

Code

图像中的updateCarrier函数起作用。我在使用pushCurrentHolder函数时遇到麻烦。

非常感谢任何人能提供帮助!预先感谢。

3 个答案:

答案 0 :(得分:2)

您正在混淆Realtime Database和Firestore API。它们不是同一数据库,并且具有完全不同的API。

Firestore中没有push()方法。也没有child()方法。因此,这段代码毫无意义:

firebase.firestore()
    .collection('packages')
    .doc(`${parcelId}`)
    .child("packageTransactions")
    .push()
    .set({"userId": user.uid, "transactionTime": moment().format("YYYY-MM-DD HH:mm:ss")})

如果要将文档添加到具有随机ID的软件包集合中,请执行以下操作:

firebase.firestore()
    .collection('packages')
    .doc(parcelId)
    .add({"userId": user.uid, "transactionTime": moment().format("YYYY-MM-DD HH:mm:ss")})

我确定这不会完全满足您的要求,但是您可以看到API的工作原理。

我强烈建议您回顾Firestore documentation for writing data以便更好地了解API。

答案 1 :(得分:1)

您正在混合Firebase实时数据库和Firestore,firestore中没有child()方法:

var db= firebase.firestore();
var ref = db.collection("packages").doc(`${parcelId}`);
var transactRef = ref.collection("packageTransactions");
transactRef.add({
  "userId": user.uid, 
  "transactionTime": moment().format("YYYY-MM-DD HH:mm:ss")
})

检查文档

https://firebase.google.com/docs/firestore/manage-data/add-data#web

答案 2 :(得分:1)

firestorerealtime的API不同。您正在混淆这两个API的方法。 push()child()方法是realtime API而非firestore的API。要实现您想要的目标,请执行以下操作:

const db = firebase.firestore()

let transactRef = db.collection("packages")
                    .doc(parcelId)
                    .collection("packageTransactions")

transactRef.add({
  userId: user.uid,
  transactionTime: moment().format("YYYY-MM-DD HH:mm:ss")
})