2014-02-05 132 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); 
    }