2012-09-01 5 views
33

Mit Meteor versuche ich zu verstehen, wenn serverseitige Meteor.methods() zu verwenden, während Instant-UI-Updates weiterhin beibehalten.Wann Meteor.Methods zu verwenden und Stubs zu verwenden

Von Andrew Scala introductory tutorial, behauptet er, dass Meteor.methods() verwendet werden sollten, wenn Sie aktualisieren möchten, und Ihre Datenbankdokumente zu ändern:

Die Idee ist, dass Sie alle Funktionen auf dem Server definieren, die gefährliche Dinge zu tun wie Daten ändern und aktualisieren, und lassen Sie dann den Client rufen diese Funktionen und erhalten Rückgabewerte wie normale Funktionen. Der Client sieht die Implementierung nie und ändert die Daten nicht persönlich. Der Server erledigt die ganze Arbeit.

Und im Anschluss an diese Beratung, ich implementiert dies in meinem Code:

Server-Seite:

Meteor.methods({ 

    addMovie: function(data) { 
    var movie = Movies.insert({name: data}); 
    return movie; 
    }, 

    ... 

Client-side:

Template.movies.events = ({ 

    'click #add-movie': function(e) { 

    var name = document.getElementById('movie-name').value; 
    Meteor.call('addMovie', name); 

    return false; 

    }, 

    ... 

Dies funktioniert, aber es ist langsam . Die Benutzeroberfläche wird nicht sofort aktualisiert, als wenn Sie auf der Clientseite Movies.insert() aufgerufen hätten. Die docs zeigen, dass das Problem zu beheben, Sie Stubs auf der Client-Seite erstellen:

Aufrufe von Methoden auf dem Client definiert Stub-Funktionen im Zusammenhang mit Server Methoden mit dem gleichen Namen. Sie müssen keinen Stub für Ihre Methode definieren, wenn Sie nicht möchten. In diesem Fall sind Methodenaufrufe nur wie Remoteprozeduraufrufe in anderen Systemen, und Sie müssen auf die Ergebnisse vom Server warten.

Aber wie sollen diese Stubs aussehen? Sollte es im Prinzip genauso aussehen wie die serverseitige Methode? Wenn ja, worauf kommt es an? Ich bin auf der Suche nach einer umfassenderen Erklärung der Verwendung und des Zwecks von Meteor.methods(), dem Punkt/der Verwendung von Stubs und deren Implementierung.

EDIT: David Greenspan hat geholfen, die Verwendung von Meteor.methods() und Stubs auf meteor-talk zu klären.

+1

Sind Sie mit Davids Antwort zufrieden? Wenn ja, poste es einfach als Antwort und akzeptiere es. –

Antwort

19

hier ist ein weiteres Beispiel.

sagen Sie ein Bingo-Spiel gerade schreiben und Sie auf die Schaltfläche klicken, um als „Haus!“ .. in dem Click-Ereignis eine Methode nennen könnte, z.B.

Method.call("callHouse"); 

dies wird die Server-Methode aufrufen:

// on the server 
Meteor.methods({ 
    callHouse: function() { 
    if (currentGame.isInProgress) { 
     currentGame.winner = this.userId; 
     currentGame.end(); 
    } 
    } 
}); 

, wenn Sie das erste nennen „Haus“ sind, .. das Verfahren werden Sie als Gewinner markieren extrem aber lassen Sie uns so tun, als das Verfahren langsam und Ihre Client-Anwendung wartet .. sind Sie 99% sicher, dass der Server, den Sie der Gewinner sind bestätigen - ohne Wartezeit Sie wollen einfach nur den Bildschirm des Benutzers aktualisieren .. in diesem Fall eine clientseitige Stub implementieren:

// on the client 
Meteor.methods({ 
    callHouse: function() { 
    currentGame.winner = Meteor.userId(); 
    // add any other side-effects you expect to occur here 
    } 
}); 

Wenn das Serverergebnis zurückgegeben wird und die zurückgegebenen Daten sich von den Angaben im Stub unterscheiden, wird das Problem korrigiert und der Bildschirm entsprechend aktualisiert.

+0

Warum haben Sie 'this.userId' auf dem Server und' Meteor.userId() 'auf dem Client verwendet? – CaptSaltyJack

+0

Ich kann mich nicht erinnern, ich bin Meteor vor Jahren – Lloyd

+4

Binned Das ist schade. 1.0 Felsen! – CaptSaltyJack

12

Kurz:

einige Methoden definieren (Meteor.methods) in den Dateien zum Server geschoben, der auf dem Server eigentliche Arbeit tun wird, definiert einige Methoden (Meteor.methods) in den Dateien des gedrückten Client ein ‚Instant‘ Verhalten auf dem Client (wie zum Beispiel eine Ladeanzeige) zu erhalten, bis der Server

die sich daraus ergebenden Änderungen an den Client zurück schiebt

Hier ist Davids Original-Beitrag:

Hallo Ben,

Im Prinzip kann eine Methode auf dem Client und dem Server völlig verschiedene Aktionen ausführen, z. B. eine Ladeanzeige auf dem Client anzeigen und mit einer Remote-API auf dem Server sprechen. Anrufe an Meteor.Methoden auf dem Client definieren das Verhalten des Clients und Aufrufe an Meteor.Methoden auf dem Server definieren das Serververhalten.

Für Methoden, die auf der Datenbank arbeiten, oft die gleiche Implementierung für beide tun. Die Clientversion wirkt sich auf die clientseitige Datenbank aus (der browserseitige "Cache" der abonnierten Dokumente ) und die serverseitige Version wirkt sich auf die reale Datenbank aus. Wenn der Client zurück hört, "schnappt" er auf das Ergebnis der serverseitigen Mutationen; Die clientseitigen Datenbankmutationen werden verworfen (oder rückgängig gemacht, je nachdem, wie Sie darüber denken). Wenn eine clientseitige Methode andere Verfahren nennt, sind diese sekundären Anrufe nicht zum Server remoted. Die serverseitige Version wird entweder die gleichen Methoden auf dem Server oder nicht aufrufen, wie es für richtig erachtet.

Also jede clientseitige Methode, die Sie zur Verfügung stellen, ist nur eine "Simulation" und muss nicht genau sein (kann es nicht sein). Die Hoffnung ist , dass Sie die Simulation impl im Allgemeinen kostenlos erhalten, weil es das selbe wie der Server impl ist!

Beantwortet das Ihre Frage?

- David

+0

Danke Jay. Ich hatte die Absicht, darauf eine Antwort zu schreiben, nachdem ich mehr Erfahrung mit Stubs hatte. Ich werde vielleicht das tun, aber ich werde deine Antwort für jetzt akzeptieren. – bento

+0

@jay, Wird die Verwendung einer Methode für Client und Server (außerhalb von Client- und Serverordnern) die gleichen Auswirkungen haben? – securecurve

+2

Hi @securycurve Der Stub ist nur für die sofortige Aktualisierung des Clients gedacht, und sein Ergebnis wird überschrieben, sobald der Server die Operation ausgeführt und zurückgegeben hat. Wenn Sie beispielsweise eine upVote-Methode verwenden, können Sie auf Ihrem Client einfach 1 zu den Abstimmungen hinzufügen und die Benutzeroberfläche aktualisieren. Gleichzeitig ruft Meteor dieselbe Methode auf dem Server auf (möglicherweise oder auch nicht) gib das gleiche Ergebnis zurück, wenn andere Leute zum Beispiel gewählt haben) – jay

3

Wenn Sie eine Methode für eine Datei von Client/Server wie /collections geteilt definieren würde es nicht für beide und automatisch Stummel zugänglich sein? So

:

/collections/houses.js

Meteor.methods({ 
    callHouse: function() { 
    if (currentGame.isInProgress) { 
     currentGame.winner = this.userId; 
     currentGame.end(); 
    } 
    } 
}); 

Dies wird zur Verfügung stehen sowohl der Client und Server. Wenn es nicht besteht, wird der Server das Client-Update automatisch ablehnen/rückgängig machen.

+0

Ist es sicher? Da der Benutzer Zugriff auf den Code –

+0

hat Ja, verwenden Sie Meteor Sicherheitsregeln dafür. –

+0

@BrunoLemos Ich hatte diese Bedenken auch am Anfang, aber ein Teil der Designprinzipien hinter Meteor ist, dass es überall eine Datenbank ist, so dass Sie die gleichen Methoden verwenden können, um vom Client und Server auf Ihre Datenbank zuzugreifen. Es spielt keine Rolle, dass der Client Zugriff auf den Code hat, denn egal, was auf der Client-Seite ist, die Server-Seite wird immer validieren. – d4nyll

3

Wie gesagt Daniel Sie eine Methode für eine Datei definieren können, welche nicht in Client- oder Server-Verzeichnisse und auf beiden Seiten. Sie können auch den booleschen Wert isSimulation verwenden, um zusätzliche Prüfungen durchzuführen.Zum Beispiel kann es in etwa so aussehen:

Meteor.methods({ 
    addMovie: function (movieData) { 
    if (!this.isSimulation) { 
     check(movieData, someAdditionaCheckinFunc); 
    } 
    Movies.insert(movieData); 
    } 
}) 

So wird Code in der bedingten Verzweigung nur auf dem Server ausgeführt.

Verwandte Themen