【问题标题】:return value from callback in node.js and mongoose从 node.js 和 mongoose 中的回调返回值
【发布时间】:2014-03-01 12:20:31
【问题描述】:

我尝试了以下代码。

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这里返回的是猫鼬数据类型。

我希望像这样调用认证函数 -

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

实施 Mustafa Genç 解决方案后的更新

在熟悉了回调之后,我最终得到了以下代码。

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
          }
      });
  }

【问题讨论】:

    标签: javascript node.js mongodb asynchronous mongoose


    【解决方案1】:

    你需要一个回调函数,因为这是一个异步请求:

    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】:

      您也可以尝试使用 Promise。

      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);
        }
      

      【讨论】:

        猜你喜欢
        • 2014-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 2017-04-06
        • 1970-01-01
        • 2018-08-15
        相关资源
        最近更新 更多