2013-04-20 15 views
5

私はMeteorとストライプパッケージを使って顧客を作りました。だから、最初に私がクリックしたときに、私はclient.jsを持っているサーバー上のメソッドを呼び出して、私のクライアント側のコードを持っている:ストライプ決済応答を返すための流星呼出の取得

Meteor.call('usersignup', function (error, result) { 
    console.log (result); 
}); 

だから、これはserver.jsにメソッドを呼び出します。

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は未定義に戻りますが、数秒後にmeteor.callの内部からresultとconsoleという文字列 "meteor call"を受け取ります。流星の呼び出しが完了してから、私のクリック機能の残りの部分を実行するのを待つ方法はありますか?

  • "ハロー"
  • "外線"
  • テストID未定義
  • cusid未定義
  • "流星コール"
  • "結果"
:ので、出力は以下のようになりますコンソール

答えて

9

ストライプAPIはFibersを使用しないことに注意してください。手動で入力する必要があります。コールバックはクライアント側に到達していないため、応答(非同期)を既に受け取っている可能性があります。

結果がクライアントに返される前に、ストリーミングコールバックの結果を待つために、ここFuture

var stripe = StripeAPI('mykeygoeshere'); // secret stripe API key 
var Future = Npm.require('fibers/future'); 

var fut = new Future(); 

stripe.customers.create(
    { email: '[email protected]' }, 
    function(err, customer) { 
     if (err) { 
      console.log(err.message); 
      fut.ret; 
     } 
     fut.ret("customer id", customer.id); 
    } 
); 
return fut.wait(); 

が使用され、その結果がクライアントに返される前に、結果がストライプコールバックから受信するのを待ちます。ここだ

  1. Meteor: Calling an asynchronous function inside a Meteor.method and returning the result
  2. https://github.com/laverdet/node-fibers
  3. https://gist.github.com/possibilities/3443021
+0

は、これは素晴らしい仕事が、私は、たとえばそれがスロー顧客を削除します別の方法を作るために行ったときエラー( '1回以上解決された未来')。だから、誰かがクリックしてフォームからすべての情報を取得し、stripe.customerを作成してMeteor.userを作成しますが、Accounts.createUserがエラーをスローすると、ストライプカスタマーを削除するメソッドが実行されます。ストライプのdelメソッドを呼び出すと、エラーが返されます。 – asiammyself

+0

更新されたコードを投稿できますか?私はもう少し進む必要がありますが、複数の返品が提供されているので、fut.retが1回のみ実行されるようにする必要があります。 – Akshat

+0

更新されたコード。未来をグローバルなものにしました。それがそれを処理する正しい方法であるかどうかわからないが、今のところ働く。機能はまだ編集されたポストを参照してリターンを待っていないようです。 – asiammyself

1

詳しい情報は、繊維/先物それらを使用する際にそれらについて&を行くためにどのようにincuding &同期コールバックで見つけることができます何か簡単です。流星は今、このような状況のため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

+0

クライアントで何が起こっているのかを知るにはどうすればよいですか?私はこのサーバーメソッドを呼び出した後でのみ、未定義の結果を得ています。 – quape

関連する問題