Error: Meteor code must always run within a Fiber
Error: Meteor code must always run within a Fiber
我在我的应用程序中使用 stripe 进行支付,我想在交易成功后在我自己的数据库中创建一个收据文档
我的代码:
Meteor.methods({
makePurchase: function(tabId, token) {
check(tabId, String);
tab = Tabs.findOne(tabId);
Stripe.charges.create({
amount: tab.price,
currency: "USD",
card: token.id
}, function (error, result) {
console.log(result);
if (error) {
console.log('makePurchaseError: ' + error);
return error;
}
Purchases.insert({
sellerId: tab.userId,
tabId: tab._id,
price: tab.price
}, function(error, result) {
if (error) {
console.log('InsertionError: ' + error);
return error;
}
});
});
}
});
然而这段代码returns一个错误:
Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.
我不熟悉纤维,知道这是为什么吗?
您可能想查看 http://docs.meteor.com/#/full/meteor_wrapasync 的文档。
这里的问题是你传递给 Stripe.charges.create
的回调函数是异步调用的(当然),所以它发生在当前 Meteor 的 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
上下文,以备不时之需。
我在我的应用程序中使用 stripe 进行支付,我想在交易成功后在我自己的数据库中创建一个收据文档
我的代码:
Meteor.methods({
makePurchase: function(tabId, token) {
check(tabId, String);
tab = Tabs.findOne(tabId);
Stripe.charges.create({
amount: tab.price,
currency: "USD",
card: token.id
}, function (error, result) {
console.log(result);
if (error) {
console.log('makePurchaseError: ' + error);
return error;
}
Purchases.insert({
sellerId: tab.userId,
tabId: tab._id,
price: tab.price
}, function(error, result) {
if (error) {
console.log('InsertionError: ' + error);
return error;
}
});
});
}
});
然而这段代码returns一个错误:
Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.
我不熟悉纤维,知道这是为什么吗?
您可能想查看 http://docs.meteor.com/#/full/meteor_wrapasync 的文档。
这里的问题是你传递给 Stripe.charges.create
的回调函数是异步调用的(当然),所以它发生在当前 Meteor 的 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
上下文,以备不时之需。