解决Cloud Functions中的“ TypeError:无法读取未定义的属性'data'”

时间:2019-02-12 11:26:06

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

很抱歉,如果这似乎是一个非常基本的问题,那么云功能的概念对我来说是一个新事物,我在学习过程中仍然处于高度地位。

但是,在尝试执行此云功能时,出现以下错误

TypeError: Cannot read property 'data' of undefined

完整日志可见here

我也没有提供此功能,只是为了使其正常工作,我使用了this视频。

实际的云功能:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);

const firestore = admin.firestore();
const settings = { timestampInSnapshots: true };
firestore.settings(settings);

const stripe = require('stripe')(functions.config().stripe.token);

exports.addStripeSource = 
functions.firestore.document('cards/{userid}/tokens/{tokenid}')
.onCreate(async (tokenSnap, context) => {

    var customer;
    const data = tokenSnap.after.data();

    if (data === null) {
        return null
    }
    const token = data.tokenId;
    const snapchat = await 
    firestore.collection('cards').doc(context.params.userId).get();
    const customerId = snapshot.data().custId;
    const customerEmail = snpashot.data().email;

    if (customerId === 'new') {
        customer = await stripe.customers.create({
            email: customerEmail,
            source: token
        });

firestore.collection('cards').doc(context.params.userId).update({
            custId: customer.id
        });
    }

    else {
        customer = await stripe.customers.retrieve(customerId)
    }

    const customerSource = customer.sources.data[0];

    return firestore.collection('cards').doc(context.params.userId).collection('sources').doc(customerSource.card.fingerprint).set(customersource, { merge: true });})

用于编写付款服务的dart代码:

import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

class PaymentService {
  addCard(token) {
    FirebaseAuth.instance.currentUser().then((user) {
      print("Found User");
      Firestore.instance
          .collection('cards')
          .document(user.uid)
          .collection('tokens')
          .add({'tokenId': token}).then((val) {
        print('saved');
      });
    });
  }
}  

最后,当我按下按钮时执行什么操作

StripeSource.addSource().then((String token) {
            print("Stripe!");
            PaymentService().addCard(token);
          });

如您所见,代码显然已被触发,但是我想数据变量存在某种错误,JavaScript对我来说是全新的,因此请确保它存在某种非常愚蠢的语法问题。

2 个答案:

答案 0 :(得分:0)

如您提供的日志输出所说明:您需要为firestore.document函数定义一个引用:

functions.firestore.document('cards/{userid}/tokens/{tokenid}')

修改为:

functions.firestore.documentReference(){


}

答案 1 :(得分:0)

从所附的日志图片中,错误为context is not defined

functions.firestore.document('cards/{userid}/tokens/{tokenid}')
.onCreate(async (tokenSnap, conetxt) => {

在上述函数中,您已将参数传递为conetxt,随后在函数context中使用了参数,因为它会导致undefined错误。

将参数名称conetxt更改为context