2016-08-01 2 views
0

Also im Grunde ruft der Client den Server mit einem Meteor.call. Die Server-Methode führt dann einige Validierungen durch und ruft einen Web-Service mit einem Meteor-Paket auf. Wenn die Validierung fehlschlägt und ein Meteorfehler ausgelöst wird, erreicht sie den Server. Wenn die Paketantwort einen Fehler aufweist, meldet sie sich nur beim Server an. Ich brauche den Fehler, um den Client zu erreichen.Werf Meteor.Error erreicht den Client nicht

So sieht der Code aus.

Kunde

Meteor.call('callService', (err, result) => { 
    if(err) { 
     console.log(err.reason); 
    } 
}); 

Server

Meteor.methods({ 
    'callService'(){ 
     if (!Meteor.user()) { 
      // Error 1 
      throw new Meteor.Error('insufficient-permissions', 'You need to login first'); 
     } 
     // Using an meteor package to actually call the service 
     package.callService(apiKey, (err, response) => { 
      if (response.status === 'error') { 
       // Error 2 
        throw new Meteor.Error('service-error', response.message); 
      } 
     }); 
    }, 
}); 

Im Server-Methode, wenn ein Fehler bei Fehler 1 geworfen wird, hat es den Client erreichen, aber Fehler 2 nicht. Fehler 2 meldet nur den Server an.

Antwort

1

Ich denke, Ihre package.callService() ist async (vorausgesetzt, dass es einen Rückruf akzeptiert).

In diesem Fall startet Ihre Meteor-Methode die asynchrone Task, setzt dann ihren Prozess fort und kehrt zurück (da keine weiteren Anweisungen vorhanden sind), während die asynchrone Task noch läuft (tatsächlich auf eine Antwort von Ihrem Remote-Webdienst wartet). . Daher erhält der Rückruf Ihres Client-Meteor-Calls eine "no error" -Antwort.

Sobald Ihr "Fehler 2" auftritt, ist der Meteor-Anruf bereits abgeschlossen und der Fehler kann nur auf dem Server protokolliert werden.

Wenn Sie wollen „auflegen“ Ihre Methode, so dass es für das Ergebnis Ihrer package.callService() wartet, um zu bestimmen, ob es ein Erfolg ist oder ein Fehler auf und füllen Sie entsprechend den Meteor Anruf, könnten Sie versuchen Meteor.wrapAsync() verwenden.

Übrigens, wenn Sie synchrone Aufgabe verwenden, um tatsächlich auf einen Remote-Dienst zu warten, würden Sie sich für this.unblock() interessieren, damit Ihr Server andere Aufgaben (Methoden) statt nur im Leerlauf verarbeiten kann.

+0

Das war völlig der Fall. Es tut mir leid, ich habe total vergessen, dies als akzeptiert zu markieren – nupac

Verwandte Themen