gpt4 book ai didi

meteor - 错误: Meteor code must always run within a Fiber

转载 作者:行者123 更新时间:2023-12-02 17:54:18 24 4
gpt4 key购买 nike

我在我的应用程序中使用 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;
}
});
});
}
});

但是此代码返回错误:

Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.

我不熟悉纤维,知道这是为什么吗?

最佳答案

这里的问题是您传递给 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上下文,以防万一需要。

关于meteor - 错误: Meteor code must always run within a Fiber,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27769527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com