【问题标题】:Not able to access a specific field from a collection in Firebase无法访问 Firebase 集合中的特定字段
【发布时间】:2020-03-28 06:00:31
【问题描述】:

在编写云函数时,我试图访问集合 cards 中的 Email 字段。在Firebase 中,我创建了一个新用户并从该用户登录,并使用FirebaseAuth.instance.currentUser() 将该用户电子邮件地址保存到Firebase 数据库并创建一个文档名称.document(user.uid) 现在我正在此代码中的node.js 中访问此用户ID

const snapshot=await firestore.collection('cards').doc(context.params.userId).get();
const customerEmailaddress= snapshot.data().Email;

但我无法使用此代码访问该电子邮件。 颤振应用程序代码是将数据保存到firebase数据库的代码

    class PaymentServices{
  addCard(token){
    FirebaseAuth.instance.currentUser().then((user){
      Firestore.instance
          .collection('cards')
            .document(user.uid)
          .collection('tokens').add({
      'tokenid': token.tokenId,
      'Email': user.email,
      'customerid': 'new'
      }).then((val){

      });
      print("saveedd");
    });
  }
}

云功能 数据已成功插入 firebase 我只想从 firebase 访问它并将值存储在 customerEmailaddress 等变量中

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const firestore= admin.firestore();
const stripe = require('stripe')('sk_test_.........');
exports.StripeSource =functions.firestore.document('cards/{userid}/tokens/{tokenid}').onCreate(async (tokenSnap,context) => {
var customerdata;
const data=tokenSnap.after.data();

const snapshot=await firestore.collection('cards').doc(context.params.userId).get();
const customerEmailaddress= snapshot.data().Email;
const customerid= snapshot.data().custid;
 customerdata = await stripe.customers.create({
  email: customerEmailaddress,
})
});

简单示例 user.id case 可能有问题,但此代码也没有从快照变量中的 firebase 获取数据

 exports.StripeSource =functions.firestore.document('data/{card}/tokens/{tokenid}').onCreate(async (tokenSnap,context) => {
      const snapshot = await firestore.collection('data').doc('card').get();
      const customerEmailaddress= snapshot.data().Email;
        const customer =  stripe.customers.create({
            email: customerEmailaddress,
          })
          .then((customer) => {  
                    return stripe.customers.createSource(customer.id, {
                      source: 'tok_visa',
                    });
      }) 
      });

【问题讨论】:

    标签: javascript firebase flutter google-cloud-firestore google-cloud-functions


    【解决方案1】:

    您确定要阅读的文档存在于所需 ID 下的集合“卡片”中吗?在 Firebase 控制台上检查它。

    因为我认为您在保存数据代码中存在错误:add() 直接用于集合,因此您插入具有随机生成 ID 的文档。但是您有 ID,因此您应该在特定文档上使用 setData()

    插入具有随机 ID 的新文档:

    Firestore.instance.collection('cards').add({'Email': user.email});
    

    插入具有已知 ID (user.uid) 的新文档:

    Firestore.instance.collection('cards').document(user.uid).setData({'Email': user.email});
    

    【讨论】:

    • 我正在使用 user.uid(firebase autogenrted id) 制作文档。并尝试使用此 const snapshot=await firestore.collection('cards').doc(context.params.userId).get(); 访问 node.js 中的用户 ID直到这一行,我的代码还可以吗?这是从 node.js 中的 firebase 访问 user.uid 的一种方式吗?我有点困惑
    • 您应该向我们展示您在哪里使用该代码以及它是什么类型的功能,看看它是否正确。当您说从 node.js 访问 user.uid 时,它取决于函数上下文以及用户是否是执行函数的人 (reference)。您使用它的方式(context.params.userId)是用于数据库触发函数,其中 userId 是 ref() 路径中的通配符,请检查之前的链接。
    • 通配符 userId 存在拼写错误:在您的 ref 路径上输入“userid”,然后您正在恢复“userId”(大写 I)
    • 感谢 Erick,即使我的这段代码不起作用。当我输入静态电子邮件地址时,它使客户成为条带帐户,但是当我从火力基地检索数据时,它在这里不起作用。这是简单的代码,请检查它我用名称简单示例更新最后一个问题中的代码
    • 好的,这很奇怪,我能想到的可能是 async/await 它不能正常工作,但如果你使用 Node 8 作为运行时它应该可以工作。确保您在“package.json”上使用 Node 8 运行时或删除 async/await 并尝试使用带有 then() 和 catch() 的传统 Promise 获取数据并打印错误(如果有)。
    猜你喜欢
    • 2018-12-20
    • 2020-03-15
    • 1970-01-01
    • 2015-08-07
    • 2018-02-02
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多