2014-02-05 64 views
0

我試過下面的代碼。從node.js和mongoose回調返回值

function authenticate(accesskey) { 
    var res = someModel.findOne({'uid': accesskey}, function (err , user) { 
      if(err){ 
       console.error("Can't Find.!! Error"); 
      } 
      if(user===null){ 
       return false; 
      } 
      else{ 
      console.log(user); 
      return true; 
      } 
    }); 
    console.log(res); 
    return res; 
} 

res這裏返回貓鼬的數據類型。

我要撥打的認證功能,這樣的 - 從穆斯塔法GENC

實現方案越來越舒服回調我結束了下面的代碼後後

if(authenticate(req.params.accesskey)){ 
//do something 
} 
else{ 
//do something else 
} 

更新。

function authenticate(req, result, accesskey, callback) { 
    var auth = null; 

    someModel.findOne({'uid': accesskey}, function (err , user) { 
      console.log("try authenticate"); 
      if(err){ 
       console.error(err); 
      } 
      if(user===null) 
       auth = false; 
      else 
       auth = true; 
      callback(auth); 
    }); 
} 

我這樣使用它 -

routeHandler(req, reply) { 
     authenticate(req, reply, req.params.accesskey , function (auth) { 
      if(auth) { 

       //"primary code" 

      } 
      else { 
       //fallback 
      } 
     }); 
    } 

回答

8

你需要一個回調函數,因爲這是一個異步請求:

function authenticate(accesskey, callback) { 
    var auth = null; 

    userModel.findOne({'uid': accesskey}, function(err, user) { 
     console.log("TRY AUTHENTICATE"); 

     if (err) { 
      console.error("Can't Find.!! Error"); 
     } 

     //None Found 
     if (user === null) { 
      console.error("ACCESS ERROR : %s Doesn't Exist", accesskey); 
      auth = false; 
     } else { 
      console.log(user); 
      auth = true; 
     } 

     callback(auth); 
    }); 
} 

而調用這個函數,如:

authenticate("key", function (authResult) { 
    //do whatever 
}); 
2

你也可以嘗試承諾。

function authenticate(accesskey) { 
    var promise = someModel.findOne({'uid': accesskey}).exec(); 
} 

routeHandler(req, reply) { 
     authenticate(req.params.accesskey) 
     .then(function (auth) { 
      if(auth) { 
       //"primary code" 
      } 
      else { 
       //fallback 
      } 
     }) 
     .catch(console.error); 
    }