Ответ 1
Проблема здесь в том, что функция обратного вызова, которую вы передаете в Stripe.charges.create
, называется асинхронно (конечно), поэтому она происходит за пределами текущего метеорного Fiber
.
Один из способов исправить это, чтобы создать собственное Fiber
, но самое легкое, что вы можете сделать, это обернуть обратный вызов с помощью Meteor.bindEnvironment
, поэтому в основном
Stripe.charges.create({
// ...
}, Meteor.bindEnvironment(function (error, result) {
// ...
}));
редактировать
Как было предложено в другом ответе, другой и, вероятно, лучший образец, который следует здесь, это использовать вспомогательный метод Meteor.wrapAsync
(см. Docs), который в основном позволяет превратить любой асинхронный метод в функцию, осведомленную о волокнах, и может использоваться синхронно.
В вашем конкретном случае эквивалентное решение было бы написать:
let result;
try {
result = Meteor.wrapAsync(Stripe.charges.create, Stripe.charges)({ /* ... */ });
} catch(error) {
// ...
}
Обратите внимание, что второй аргумент передан Meteor.wrapAsync
. Именно там, чтобы убедиться, что первоначальный Stripe.charges.create
получит надлежащее this
контекст, только в случае, если это необходимо.