2016-11-29 9 views
1

Ich verwende vpulim:node-soap, um einen Soap-Server laufen zu lassen.Async-Funktionen im Meteorserver

Mein Meteor Start des Servers enthält dies unter verschiedenen anderen Code:

authRequestOperation: function(args,cb,headers,req) { 
     console.log(args); 
     var authResponceObject = {}; 
     var futureAuthResponse = new Future(); 
     Fiber(function(){ 
     if(collectorUsers.findOne({username: args.username})){ 
      console.log("Found User"); 
      authResponceObject = { 
      username: args.username, 
      nonce: Random.id() 
      }; 
      console.log("authResponceObject is: " + JSON.stringify(authResponceObject,null,4)); 
      console.log("futureAuthResponse returning..."); 
      futureAuthResponse.return(authResponceObject); 
     } 
     // console.log("futureAuthResponse waiting..."); 
     // return futureAuthResponse.wait(); 


     }).run(); 
     console.log("authResponceObject after fiber is: " + JSON.stringify(authResponceObject,null,4)); 
     return authResponceObject; 
    }, 

Was ich versuche zu tun:

  1. ich ein Benutzerobjekt vom Client empfangen.
  2. ich überprüfen, ob der Benutzer in dem mongodb
  3. vorhanden ist Wenn der Benutzer vorhanden ist, Antwortobjekt
  4. Respond an den Client mit dem Response-Objekt herzustellen.

Ich habe 1. funktioniert. Da es sich jedoch um einen asynchronen Anruf handelt, ist die Reihenfolge 2,3,4 durcheinander.

Gerade jetzt, was passiert ist:

  1. erhalten Objekt Client
  2. Rückkehr Antwortobjekt
  3. prüfen Mongo (die leer ist)
  4. Response-Objekt vorbereiten.

Ich verwende Meteor.methods nicht für das oben genannte. Wie mache ich das auf die richtige Art und Weise? Ich habe versucht, Jonglieren um wrapAsync und fiber/future, aber Sackgassen zu schlagen.

+0

Warum verwenden Sie 'Fiber' oben in Ihrem Code? '.findOne' ist bereits synchronisiert. Siehst du einen Fehler, wenn du 'Fiber' nicht verwendest? – Khang

+0

Da ich den Code außerhalb von Meteor.methods verwende, muss ich ihn in eine Fiber einpacken. Oder ich bekomme einen Fehler, der besagt, dass Meteor mit einer Faser laufen muss. – blueren

Antwort

1

Ich glaube Meteor.bindEnvironment Ihr Problem lösen können, versuchen Sie diesen Code:

{ 
    // ... 
    authRequestOperation: Meteor.bindEnvironment(function(args, cb, headers, req) { 
    console.log(args); 
    var authResponceObject = {}; 

    if (collectorUsers.findOne({username: args.username})) { 
     console.log("Found User"); 
     authResponceObject = { 
     username: args.username, 
     nonce: Random.id() 
     }; 
     console.log("authResponceObject is: " + JSON.stringify(authResponceObject, null, 4)); 
    } 


    return authResponceObject; 
    }), 
    // ... 
} 
+0

Das hat den Trick gemacht. Vielen Dank. – blueren