2013-04-20 4 views
5

Ich habe mit Meteor und dem Stripe-Paket gearbeitet, um zu versuchen, einen Kunden zu machen. So Zuerst habe ich meine Client-Seite Code haben, die ein Verfahren auf dem Server ruft so, wenn darauf geklickt i in den Client.js haben:Erhalten Meteor Anruf zur Rückkehr Streifen Zahlungen Antwort

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

So nennt dies die Methode auf den 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(); 
    } 

}); 

Jetzt funktioniert das und ich erstelle einen Kunden, wenn ich mich beim stripe.com-Dashboard anmelde, aber ich versuche, die Antwort an den Client zurückzubekommen, zumindest die Kundennummer für den Augenblick und drucke sie in der Konsole aus. Dies ist, wo ich es nicht zum Funktionieren bringen kann. Es wird nicht definiert, wenn ich console.log (Ergebnis) mache. Irgendwelche Ideen?

EDIT: Also habe ich die Faser und den Stripe Key als globale Variablen jetzt und bekomme keinen Fehler, aber die Renditen scheinen keine Werte zurückzugeben. so auf der Client-Seite habe ich:

'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); 
    }, 
}); 

Also habe ich einige console.log Tests wurden ausgeführt, und es scheint sie die meteor.call führt und hält die Linie hinunter. Console.log von sowohl testid als auch cusid gibt undefined zurück, aber ein paar Sekunden später erhalte ich das console.log von result und die Zeichenfolge "meteor call" aus dem meteor call. Gibt es eine Möglichkeit zu warten, bis der Meteor-Call beendet ist, und dann den Rest meiner Click-Funktion laufen zu lassen? so Konsolausgabe gehen wie:

  • "Hallo"
  • "außerhalb Anruf"
  • Test-ID nicht definiert
  • cusid undefined
  • "Meteor Anruf"
  • "Ergebnis"

Antwort

9

Beachten Sie, dass die Stripe-API keine Fasern verwendet. Sie müssen es manuell eingeben. Der Callback erreicht den Client nicht, weil er dann bereits eine Antwort erhalten hat (async)

Sie können so etwas verwenden, um auf ein Ergebnis des Stripe-Callbacks zu warten, bevor ein Ergebnis an den Client zurückgegeben wird:

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(); 

Hier ein Future verwendet wird und es wartet auf das Ergebnis aus dem Streifen Rückruf empfangen werden, bevor ein Ergebnis an den Client zurückgegeben wird.

Weitere Informationen finden Sie auf Fasern/Futures & Synchrone Rückrufe finden incuding wie & über sie gehen, wenn sie benutzen:

  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

Dieser große gearbeitet, aber wenn ich eine andere Methode machen ging an, die beispielsweise den Kunden löschen würde es wirft ein Fehler mit ('Zukunft mehr als einmal gelöst'). So jetzt jemand Klicks einreichen bekommt alle Informationen aus dem Formular und erstellt ein stripe.customer dann eine Meteor.user erstellen, aber sagen, dass der Accounts.createUser einen Fehler wirft ich eine Methode, führen Sie die Streifen Kunden zu löschen. Nachdem ich meine Stripe Del Methode aufgerufen habe, wird der Fehler angezeigt. – asiammyself

+0

Könnten Sie den aktualisierten Code hochladen? Ich brauche ein bisschen mehr zu gehen, aber ich denke, dass es vielleicht kehrt mehrere vorgesehen sind, so dass Sie nur, um sicherzustellen, haben fut.ret läuft einmal – Akshat

+0

aktualisiert Code. Made Future eine globale Var. Ich weiß nicht, ob das der richtige Weg ist, aber jetzt funktioniert es. Die Funktion scheint immer noch nicht auf die Rückkehr zu warten. – asiammyself

1

Hier etwas einfacher.Meteor hat jetzt Meteor.wrapAsync() für diese Art von Situation:

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 

     }); 
    } 
}); 

ich diesen Beitrag gefunden wirklich hilfreich: Meteor: Proper use of Meteor.wrapAsync on server

+0

Wie finde ich heraus, was auf dem Client passiert? Ich bekomme nach dem Aufruf dieser Servermethode nur undefinierte Ergebnisse. – quape