2017-05-01 3 views
0

Ich versuche, einige geerbten Code zu refaktorieren. In jedem Endpunkt war derselbe Validierungscode. Ich möchte es in seine eigene Methode herausziehen. Ich bin neu in Versprechungen, aber ich denke, das ist es, was ich verwenden möchte. Das Problem scheint, dass der Abschlussball beim Aufruf von User.findOne aufgelöst wird und mit einem nicht definierten prom.promise endet.Mongoose scheint falsche Versprechen zu erfüllen (Knoten js)

prost bob

function validateUser(req) { 
    var prom = q.defer(); 
    var token = getToken(req.headers); 
    if (token) { 
     console.log("have a token") 
     var decoded = jwt.decode(token, config.secret); 
     console.log("now going to look for the user") 
     //Problem exit is on next line 
     User.findOne({ 
      name: decoded.name 
     }, function (err, user) { 
      if (err) throw err; 
       prom.reject(err); 
      if (!user) { 
       console.log("no user found") 
       prom.reject("Authentication failed. User not found.") 

      } else { 
       console.log("user found returning true") 
       prom.resolve(true); 

      } 
     }) 

    } else { 
     console.log("no token found") 
     prom.reject("No token provided.") 
    } 
    return prom.promise; 
} 
+1

Fallen Sie nicht für die [latente antipattern] (http://stackoverflow.com/q/23803743/1048572?What-ist-promise-construction-antipattern-and-how-to-vermeiden- es). Mongoose gibt bereits Versprechungen zurück, wenn Sie einen Rückruf nicht bestehen. – Bergi

Antwort

0

warum Sie verspricht verwenden, wenn Mungo selbst es zurückgibt.

function validateUser(req, callback) { 
var token = getToken(req.headers); 
if (token) { 
    var decoded = jwt.decode(token, config.secret); 
    User.findOne({ 
     name: decoded.name 
    }, function (err, user) { 
     if (err) throw err; 
      callback(err); 
     if (!user) { 
      callback("Authentication failed. User not found.") 

     } else { 
      console.log("user found returning true") 
      callback(null, {status:true, userData:user}); 
     } 
    }) 

} else { 
    callback("No token provided.") 
} 
} 

In obigem Code

wenn token Rückruf nicht gefunden wird, wird mit einem Fehler im ersten Versuch zurück. Wenn token gefunden wird, wird es in einer Zeile decodiert und wenn es in DB übereinstimmt, wenn das Ergebnis ein Fehler ist, dann wird der Callback mit err aufgerufen. else, wenn kein Benutzer gefunden wird oder eine leere Übereinstimmung, dann wird eine benutzerdefinierte Nachricht im Callback-Fehlerteil gesendet. Aber im Finale wird als Erfolg mit Status und userData zurückgegeben.

+1

Vielen Dank, ich wusste, dass Mongoose ein Versprechen zurück gab, ich konnte einfach nicht den Sprung machen, es zu benutzen. Nochmals vielen Dank. –

+0

-1 für die Empfehlung einer Funktion, die einen 'Callback'-Parameter akzeptiert und kein Versprechen zurückgibt. – Bergi

Verwandte Themen