Устранение «TypeError: Невозможно прочитать свойство 'data' of undefined" в облачных функциях - PullRequest
0 голосов
/ 12 февраля 2019

Извините, если это кажется действительно базовым вопросом, концепция облачных функций для меня чрезвычайно нова, и я все еще в процессе обучения.

Однако, пытаясь выполнить эту облачную функцию, яполучить следующую ошибку

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

Как вы можете видеть, код явно срабатывает, но я предполагаю, что с данными есть какая-то ошибкаvar, JavaScript для меня совершенно новый, так что я уверен, что это какая-то очень глупая проблема синтаксиса.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

В прикрепленном изображении журнала ошибка: context is not defined

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

В вышеприведенной функции вы передали параметр как conetxt и позже в функции context, из-за которойвыдает ошибку undefined.

Измените имя параметра conetxt на context.

0 голосов
/ 12 февраля 2019

Как объясняет предоставленный вами вывод журнала: вам нужно определить ссылку для вашей функции firestore.document:

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

изменить ее на:

functions.firestore.documentReference(){


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...