Извините, если это кажется действительно базовым вопросом, концепция облачных функций для меня чрезвычайно нова, и я все еще в процессе обучения.
Однако, пытаясь выполнить эту облачную функцию, яполучить следующую ошибку
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 для меня совершенно новый, так что я уверен, что это какая-то очень глупая проблема синтаксиса.