首页 > 解决方案 > 解决 Cloud Functions 中的“TypeError:无法读取未定义的属性‘数据’”

问题描述

抱歉,如果这似乎是一个非常基本的问题,云功能的概念对我来说是非常新的,我仍然处于学习过程中。

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

TypeError: Cannot read property 'data' of undefined

完整的日志可以在这里看到

作为参考,我没有制作这个功能,我只是想让它工作,我使用了这个视频。

实际的云功能:

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 });})

我用于编写支付服务的飞镖代码:

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);
          });

正如您所看到的,代码显然被触发了,但我猜 data var 存在某种错误,JavaScript 对我来说是全新的,所以我确定它是某种非常愚蠢的语法问题。

标签: javascriptdartfluttergoogle-cloud-firestoregoogle-cloud-functions

解决方案


从附加的日志图像中,错误是context is not defined

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

在上面的函数中,您已经传递了参数 asconetxt和稍后在函数context中使用,因此它给出了undefined错误。

将参数名称更改conetxtcontext.


推荐阅读