2016-04-26 11 views
1

Ich schreibe eine KOA Middleware, um Benutzerinformationen von Mongo zu ziehen, wenn es nicht zwischengespeichert wird. Ich erhalte folgende Fehlermeldung:Anrufertrag von einem Versprechen innerhalb der KOA Middleware

Die Funktion "this.getUser" gibt eine ES6-Zusage zurück, die den Benutzer von mongo abruft, wenn er nicht mit der Anforderung zwischengespeichert wird, oder einen neuen anonymen Benutzer erstellt.

module.exports = function* securityMiddleware(next) { 

    this.getUser(this.request) 
     .then((user)=>{ 
      if(user.isAonymous){ 
       //throw 401 access error 
      }else{ 
       yield next; 
      } 
     }); 

}; 

Es ist nicht gültig, weil: jshint sagt Generator eine Ausbeute haben muss und wirft einen Syntaxerror: Unerwarteter Strict-Modus reserviertes Wort.

Wie verwenden Sie, in KOA Middleware Generator Versprechungen? Ich verwende KOA v1.2.0.

Antwort

1

Sie nicht yield innen Versprechen Callbacks (die nicht Generatorfunktionen sind). Stattdessen sollst du nur das yield Versprechen abgeben!

module.exports = function* securityMiddleware(next) { 
    var user = yield this.getUser(this.request); 
    if (user.isAnonymous) { 
     // throw 401 access error 
    } else { 
     yield next; 
    } 
}; 
2

Nur um ein wenig mehr auf @ Bergis Antwort hinzuzufügen.

Die in KoaJS verwendeten Generatorfunktionen sind keine reinen JS-Generatoren. Koa wickelt die Generatoren unter Verwendung von co darunter, die die async/await Semantik simuliert mit Generatoren (https://github.com/tj/co).

Ein co -wrapped Generator kann nur bestimmte Arten von Yieldables ergeben (einschließlich Promise); und verarbeitet sie asynchron im Hintergrund und gibt den resultierenden Wert (oder Fehler) an die Generatorfunktion zurück.