我一直在使用Meteor和条纹包来尝试创造一个客户。所以首先我有我的客户端代码调用服务器上的方法所以当我点击我在client.js中时:
Meteor.call('usersignup', function (error, result) {
console.log (result);
});
所以这会调用server.js上的Method:
var Future = Npm.require('fibers/future');
var stripe = StripeAPI('my key'); // secret stripe API key
Meteor.methods({
usersignup: function(cusEmail){
var fut = new Future();
stripe.customers.create(
{ email: cusEmail },
function(err, customer) {
if (err) {
console.log(err);
fut.ret;
}
fut.ret(customer);
}
);
return fut.wait();
},
userfail: function(cusid){
var fut = new Future();
stripe.customers.retrieve(cusid, function(err, result) {
if(err){
console.log(err);
fut.ret;
}
fut.ret(err, result);
});
return fut.wait();
}
});
现在,当我登录stripe.com仪表板时,这可以工作并创建一个客户,但我正在尝试将响应至少返回给客户端,至少是客户ID,并将其打印在控制台中。这是我似乎无法让它工作的地方。当我执行console.log(结果)时,它将记录未定义。有什么想法吗?
编辑:所以我现在将光纤和条带键作为全局变量并且不会出现错误,但返回似乎没有返回任何值。所以在客户端我有:
'click #signupsubmit': function (event) {
console.log("hello");
var whatis = getVal(); // function gets value of forms and returns object
var testid;
var cusid = Meteor.call('usersignup', whatis.email, function (error, result) {
if (error) {
console.log(err.message);
return;
}
console.log(result);
console.log("meteor call");
testid = result;
return (result);
});
console.log("outside call");
console.log(testid);
console.log(cusid);
},
});
所以我一直在运行一些console.log测试,它似乎执行meteor.call并继续下线。 testid和cusid的Console.log都返回undefined但几秒钟之后我收到了console.log结果和meteor.call里面的字符串“meteor call”。有没有办法等待流星调用完成然后运行我的点击功能中的其余部分?控制台输出将如下:
答案 0 :(得分:9)
请记住条带API不使用Fibers。你需要手动把它。回调没有到达客户端,因为那时它已经有了响应(它的异步)
您可以使用类似的东西在结果返回给客户端之前等待条带回调的结果:
var stripe = StripeAPI('mykeygoeshere'); // secret stripe API key
var Future = Npm.require('fibers/future');
var fut = new Future();
stripe.customers.create(
{ email: 'hello@example.org' },
function(err, customer) {
if (err) {
console.log(err.message);
fut.ret;
}
fut.ret("customer id", customer.id);
}
);
return fut.wait();
这里使用Future
并等待从结果返回给客户端之前从条带回调接收结果。
更多信息可以在Fibers / Futures&同步回调包含如何解决这些问题&何时使用它们:
答案 1 :(得分:1)
这里有点简单。对于这种情况,流星现在有Meteor.wrapAsync():
var stripe = StripeAPI("key");
Meteor.methods({
yourMethod: function(callArg) {
var charge = Meteor.wrapAsync(stripe.charges.create, stripe.charges);
charge({
amount: amount,
currency: "usd",
//I passed the stripe token in callArg
card: callArg.stripeToken,
}, function(err, charge) {
if (err && err.type === 'StripeCardError') {
// The card has been declined
throw new Meteor.Error("stripe-charge-error", err.message);
}
//Insert your 'on success' code here
});
}
});
我发现这篇文章非常有帮助: Meteor: Proper use of Meteor.wrapAsync on server