2016-08-07 11 views
0

Ich habe ein Problem in meiner aktuellen ExpressJS-Anwendung. Ich verwende normale Funktionen, um die verschiedenen Routen in der App zu umbrechen, und wenn ein Fehler auftritt, kann ich einfach return next (err) verwenden, um die Funktion (return) zu beenden und den Fehlerhandler (next (err)) aufzurufen.Fehler vom Versprechen in ExpressJS zurück

Aber was mache ich, wenn es mehrere gefaltete Funktionen gibt, deren Ausführung ich verhindern möchte?

In meinem Code gibt es die Basisroute-Funktion, darin habe ich mehrere andere Funktionen (die Callbacks sind). In diesen Callbacks möchte ich in der Lage sein, die Routenausführung vollständig zu beenden. Zurzeit wird return next (err) nur vom aktuellen Rückruf beendet, fährt dann aber fort, die Route auszuführen.

Vielen Dank für Anregungen!

Edit: Ich habe einige Code aufgeschlüsselt das Problem zu beschreiben:

// This function is an expressJS route 
function doSomeStuff (req, res, next) {  
    var mongooseObj = new mongooseModel ({}); 
    mongooseObj.save (function (err) { 
     if (err) 
      return next (new Error ("whatever")); 
     // The line above returns from the callback, the expressJS error-handler handles the error, but then the code execution continues below 
    }); 

    // Function continues here 
} 
+0

Ihre Frage ist sehr unscharf, ohne Code aber wenn Ihre Frage zu früh Bruch eines Versprechen Kette ist, dann ist die übliche Wahl zwischen Ausnahmen und verschachtelten Versprechen. –

+0

Ich weiß, dass es unscharf ist, aber ich kann Ihnen keinen Code zur Verfügung stellen. Das direkte Werfen des Fehlers wäre eine Option, aber der expressJS-Fehlerhandler wird sich nicht darum kümmern, was er tun sollte. Ich habe keine Versprechen, deshalb gibt es keine Versprechens-Kette, um zu brechen. – NikxDa

+0

Nein, ich meine die Ausnahme zu werfen, um aus der Kette auszubrechen ** und ** sie einzufangen. Aber ohne Code gibt es leider nicht viel zu besprechen. –

Antwort

1

Natürlich unterbricht es Ihren Programmablauf nicht! Sie kommen nicht von der doSomeStuff zurück, sondern von dem anonymen Rückruf, den Sie an die save weitergeleitet haben. Diese Funktion wird nur aufgerufen nach ist der Speichervorgang abgeschlossen, und es nicht Halt Ihren Programmablauf.

Mongoose supports promises für save und ähnliche. Also der richtige Weg, um Ihr Problem zu lösen ist:

// This function is an expressJS route 
function doSomeStuff (req, res, next) {  
    var mongooseObj = new mongooseModel ({}); 
    var p = mongooseObj.save(); 
    p.then(function() { 
     // Other stuff that needs to be done *after* save succeeds 
    }) 
    .catch(function(err) { next (new Error ("whatever")); }) 
} 
+1

Ich kannte das Problem, es scheint, als hätte ich das nicht klar gesagt.Ich wusste einfach nicht, wie ich es lösen sollte. Dies scheint ziemlich gut zu funktionieren, obwohl ich thenn (null, function (err)) benutzt habe. Ich werde versuchen, zu .catch zu wechseln. Danke für Ihre Hilfe. – NikxDa

+0

Das ist gut zu hören :) vielleicht eine zusätzliche Ausarbeitung könnte anderen Menschen helfen, die die Rückkehr von einem Rückruf verwirren können! –

+0

Ich werde meinen ersten Post so schnell wie möglich aktualisieren. – NikxDa

0

Von dem, was ich davon nehmen, Ihr versucht, einen Fehler in einem Rückruf von einer Funktion zurückgeworfen zu verwenden, die diese Anrufe Rückrufen. Sie sollten wirklich einen Blick in promises werfen, wie es diesen Prozess viel einfacher machen wird. Sie können Versprechen erfüllen und sie in älteren Versionen von Node verwenden.

So wie ich versuchen würde, dies in einem Versprechen zu umschreiben wäre:

function doSomethingStuff (req, res, next) { 

     return new Promise (resolve, reject) { 

     var mongooseObj = new mongooseModel ({}); 
     mongooseObj.save (function (err) { 
      if (err) 
      reject (new Error ("whatever")); 

      else {resolve("something")} 
     }); 
    } 


    doSomethingStuff(params) 

     .then(//return from function) 
     .catch (function (err) { return err;}    

Schreiben Sie den Code wie diese sollen Sie von dem Rückruf von Ihrer Hauptfunktion zurückzukehren verwenden, um die Fehler zu lassen.