获取meteor电话返回条纹支付响应

我一直在与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(); } }); 

现在,当我login到stripe.com仪表板上时,它会工作并创build一个客户,但是我试图让响应返回到客户端,至less现在是客户ID,并在控制台中打印。 这是我似乎无法得到它的工作。 当我做console.log(结果)时它会logging未定义。 有任何想法吗?

编辑:所以我现在把光纤和条形键作为全局variables,并没有得到一个错误,但返回似乎没有返回任何值。 所以在客户端我有:

 '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.logtesting,似乎它执行meteor.call并继续下去。 两个testid和cusid的Console.log都返回undefined,但几秒钟之后,我收到了来自meteor.call的结果console.log和string“meteor call”。 有没有办法等待meteor电话完成,然后运行我的点击function的其余部分? 所以控制台输出将如下所示:

  • “你好”
  • “外线”
  • testingID未定义
  • cusid未定义
  • “meteor电话”
  • “结果”

请记住,条纹API不使用光纤。 你需要手动把它。 callback没有到达客户端,因为到那时它已经得到了一个响应(它的asynchronous)

你可以使用这样的东西来等待结果返回给客户端之前的条带callback的结果:

 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 ,并且在结果返回给客户端之前,它等待从条带callback中收到一个结果。

更多信息可以在纤维/期货和同步callback中​​find,包括如何使用它们以及何时使用它们:

  1. Meteor:在Meteor.method中调用asynchronous函数并返回结果
  2. https://github.com/laverdet/node-fibers
  3. https://gist.github.com/possibilities/3443021

这里更简单一些。 meteor现在有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 }); } }); 

我发现这个post真的有用: meteor:在服务器上正确使用Meteor.wrapAsync