2016-09-29 7 views
1

Ich verwende nodejs + Express für meinen Back-End-Service.Wie bekomme ich den Rückgabewert eines Versprechens?

Ich habe eine authenHandler.js Datei-Authentifizierung mit sequelize zu helfen:

module.exports = { 
    isAuthenticated: function(data) { 
    models.Users.find(data) 
     .then(function(user) { 
     if (user) { 
      return true; 
     } else { 
      return false; 
     } 
     }); 
    } 
} 

Wenn ich diese Hilfsfunktion in app.js bin mit:

app.use(function(req, res, next) { 
     // process to retrieve data 
     var isAuthenticated = authProvider.isAuthenticated(data); 
     console.log(isAuthenticated); 
     if (isAuthenticated) { 
      console.log("auth passed."); 
      next(); 
     } else { 
      var err = new Error(authenticationException); 
      err.status = 403; 
      next(err); 
     } 
    } 
}) 

Dies geht immer auf die else-Anweisung weil die isAuthenticated-Druckzeile immer undefiniert zurückgibt. Offenbar hat die Zusage den Wert zurückgegeben, nachdem die if-else-Anweisung aufgerufen wurde.

Ich bin mir nicht sicher, wie man die authenHandler.js und die app.js verbindet. Was ist der beste Weg, es zu tun?

+0

müssen Sie noch benötigen ('authenHandler.js') noch? –

+0

Siehe "Promise Gotchas" im Duplikat. –

+0

Sie können die isAuthenticated-Funktion als Middleware verwenden, indem Sie den Parameter req, res und next in der Funktion isAuthenticated beibehalten und das Datum selbst in der Funktion abrufen können. –

Antwort

1

ändern sie das Versprechen

isAuthenticated: function(data) { 
    return models.Users.find(data) 
     .then(function(user) { 
     if (user) { 
      return true; 
     } else { 
      return false; 
     } 
     }); 
    } 

und dann verbrauchen das Versprechen

authProvider.isAuthenticated(data) 
.then((result =>{ 
var isAuthenticated = result; 
    console.log(isAuthenticated); 
     if (isAuthenticated) { 
      console.log("auth passed."); 
      next(); 
     } else { 
      var err = new Error(authenticationException); 
      err.status = 403; 
      next(err); 
     } 
})) 
+0

Was passiert, wenn in isAuthenticated Funktion, ich habe auch eine Überprüfung: if (! Data) {return false;} bevor ich das Sequelize-Versprechen nennen? Wie sollte ich die Validierung von Daten in ein Versprechen einschließen? Danke! – jamesdeath123

+0

und was genau ergibt = = {} bedeuten? Ich denke nicht, dass es eine gültige Syntax in NodeJs ist? – jamesdeath123

+0

() => {} ist es6 Pfeilfunktion, die in älteren Versionen als 'function() {}' geschrieben werden kann. Knoten unterstützt Pfeilfunktionen. (Siehe Versionskompatibilität). Ich habe deine erste Frage nicht verstanden. – theAnubhav

1

Ihre app.js ist falsch zurück, Rückkehr IsAuthenticated kehrt Bool versprechen, nicht

Sie ändern müssen app.js gefällt das

app.use(function(req, res, next) { 

     // process to retrieve data 
     authProvider.isAuthenticated(data) 
      .then(function(isAuthenticated) { 
      if (isAuthenticated) { 
       console.log("auth passed."); 
       next(); 
      } 
      else { 
       var err = new Error(authenticationException); 
       err.status = 403; 
       next(err); 
      } 
      }); 
    } 
}) 
+0

Sieht so aus, als müsste ich auch authProvider.isAuthenticated() ändern, damit es Versprechen liefert? Wie soll ich das machen? – jamesdeath123

+0

@ jamesdeath123 Sie sollten "return" vor models.Users.xxxxx hinzufügen –

Verwandte Themen