2017-05-01 3 views
0

私はいくつかの継承されたコードをリファクタリングしようとしています。すべてのエンドポイントで同じ検証コードが使用されていました。私はそれをそれ自身の方法に引き出したい。私は約束を新しくしていますが、それは私が使いたいと思うものです。問題は、promはUser.findOneコールで解決され、未定義のprom.promiseで終了するようです。マングースは間違った約束(ノードjs)を満たすようです

歓声 ボブ

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

[繰延反パターン](http://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-それ)。あなたがコールバックを渡さないと、Mongooseはすでに約束を返します。 – Bergi

答えて

0

マングース自身がそれを返すとき、あなたが約束を使用している理由。上記のコードで

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.") 
} 
} 

tokenは、コールバックが最初の試みで、エラーで返され見つからない場合。 tokenが見つかった場合は、それは1行でデコードされ、結果がエラーであればDBで一致する場合、errパラメータでコールバックが呼び出されます。ユーザーが見つからないか、空であればコールバックエラー部分でカスタムメッセージが送信されます。しかし、finalはstatusとuserDataで成功として返されます。

+1

ありがとう、私はMongooseが約束を返すことを知っていた、私はちょうどそれを使用することに跳躍をすることができなかった。再び非常に感謝します。 –

+0

-1は 'callback'パラメータをとり、約束を返さない関数を推薦します。 – Bergi

関連する問題