Meteor: Korrekte Verwendung der Meteor.wrapAsync auf dem server
Hintergrund
Ich versuche zu integrieren, Streifen Zahlungen in meine Website. Ich brauche zum erstellen eines stripe-user mit meiner private Streifen-Taste. Ich bin die Speicherung dieser Schlüssel auf meinem server, und den Aufruf einer server-Methode um den Benutzer zu erstellen. Vielleicht gibt es einen anderen Weg, dies zu erreichen? Hier ist die stripe-api (kopiert unten für die Bequemlichkeit):
https://stripe.com/docs/api/node#create_customer
//stripe api call
var Stripe = StripeAPI('my_secret_key');
Stripe.customers.create({
description: 'Customer for [email protected]',
card: "foobar" //obtained with Stripe.js
}, function(err, customer) {
//asynchronously called
});
Meine versuche und Ergebnisse
Habe ich mit dem gleichen client-code mit verschiedenen server-code. Alle versuche sofort undefined auf die client-Konsole.log (...), sondern gebe die richtige Antwort auf die server-Konsole.log(...):
//client
Meteor.call('stripeCreateUser', options, function(err, result) {
console.log(err, result);
});
//server attempt 1
var Stripe = StripeAPI('my_secret_key');
Meteor.methods({
stripeCreateUser: function(options) {
return Meteor.wrapAsync(Stripe.customers.create({
description: 'Woot! A new customer!',
card: options.ccToken,
plan: options.pricingPlan
}, function (err, res) {
console.log(res, err);
return (res || err);
}));
}
});
//server attempt 2
var Stripe = StripeAPI('my_secret_key');
Meteor.methods({
stripeCreateUser: function(options) {
return Meteor.wrapAsync(Stripe.customers.create({
description: 'Woot! A new customer!',
card: options.ccToken,
plan: options.pricingPlan
}));
}
});
Ich habe auch versucht beide ohne Meteor.wrapAsync.
BEARBEITEN - ich bin auch mit diesem Paket:
https://atmospherejs.com/mrgalaxy/stripe
InformationsquelleAutor der Frage Adam | 2014-10-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der
Meteor.wrapAsync
http://docs.meteor.com/#meteor_wrapasync können Sie sehen, dass Sie brauchen, um es zu übergeben, eine Funktion und Optional einem Kontext, in der Erwägung, dass auf Ihr zwei versucht, übergeben Sie das ERGEBNIS des Aufrufs der asynchronen version vonStripe.customers.create
.Meteor.wrapAsync
verwandelt eine async-Funktion in eine komfortable synchron-suchen-Funktion die es erlaubt, zu schreiben sequentiell suchen code. (Motorraum ist noch alles ausgeführt, die innerhalb der asynchronen Node.js Ereignis-Schleife).Wir brauchen, um passieren zu
Meteor.wrapAsync
unsere API-Funktion (Stripe.customers.create
) zusammen mit der Funktion, Kontext, dhthis
im inneren des Körpers der API func, die in diesem Fall istStripe.customers
.EDIT :
Traditionellen Knoten-Stil-API-Funktionen nehmen in der Regel einen Rückruf als letztes argument wird genannt, bekommen schließlich, wenn die gewünschte Aufgabe abgeschlossen ist. Dieser Rückruf erfolgt 2 Argumente : Fehler und Daten, die entweder eine null nach dem Ergebnis der Ausschreibung.
Wie wir Zugriff auf das error-Objekt mithilfe der synchronen gewickelt Funktionen zurückgegeben
Meteor.wrapAsync
?Müssen wir verlassen sich auf die Verwendung von try/catch-Blöcke, da im Falle eines Fehlers, es wird ausgelöst, indem Sie die sync-Funktion statt übergeben wird als erstes argument des asynchronen callback-Funktion.
JavaScript hat keine "namespace" - Konzept, also API-Entwickler können mit dem trick der Definition einer global-Objekt fungiert als API-namespace definierten Eigenschaften für dieses Objekt sind "sub-Module" des API.
Es bedeutet, dass
Stripe.customers
ist ein Submodul der Streifen API freilegen Kunden-bezogene funcs, und als solche werden diese funcsthis
Kontext istStripe.customers
, nichtStripe
.Können Sie es selbst testen, indem Sie kopieren und einfügen dieser spöttische code in der browser-Konsole :
Und dann den Aufruf der stub-Funktion in Ihrem browser-Konsole wie diese :
InformationsquelleAutor der Antwort saimeunt
Weitere option ist das Paket die erreicht, die ähnliche Ziele verfolgen.
Aus der Paket-Infodatei:
Async.wrap(Funktion)
Wrap eine asynchrone Funktion und lassen Sie es laufen im Meteor ohne Rückrufe.
InformationsquelleAutor der Antwort FullStack
Als erstes danke an @saimeunt für seine Antwort, die macht einige schwierige Konzepte klar.
Allerdings hatte ich das problem, wollen einen klassischen asynchronen callback(err, Ergebnis), beide zeigen den Fehler und das Ergebnis zurück an den client, so dass ich geben kann informative Meldungen im browser.
Ich löste es auf diese Weise:
Server-code:
Client-code:
Sieht gut aus. Aber leider wrapAsync hat einen Fehler, (siehe https://github.com/meteor/meteor/issues/2774), weil Sie nicht wiederherstellen Sie die richtigen Fehler an den Aufrufer. Ein Genie genannt Faceyspacey geschrieben hat, einen Ersatz namens Meteor.makeAsync() findest du auf der bug-Seite habe ich erwähnt, welche jedoch liefert entweder das Ergebnis ODER der Fehler auf die 'result' - variable ist, verlassen die 'Fehler' variable nicht definiert.
Das ist in Ordnung mit mir nun, wenigstens habe ich einen Haken auf die richtige Fehler-Objekt.
Wenn Sie makeAsync (), müssen Sie die import-Futures wie dieser:
InformationsquelleAutor der Antwort mwarren
Da Sie gehen zu müssen, fast jede Funktion zu sein, umwickelt mit Async, was Sie tun sollten, ist mit diesem Paket
https://atmospherejs.com/copleykj/stripe-sync
es prewraps alle stripe-Funktionen mit WrapAsync machen Ihr Leben leichter und den code sauberer.InformationsquelleAutor der Antwort Patrick Mencias-lewis