Javascript 节点“未定义”问题

Javascript 节点“未定义”问题,javascript,node.js,asynchronous,undefined,Javascript,Node.js,Asynchronous,Undefined,因此,我目前正在尝试获取以下内容,以简单地返回变量obj。它位于auth.js中 module.exports = { cas_login: function(ticket) { var obj; cas.validate(ticket, function(err, status, username) { if (err) { // Handle the error obj={status: false, username: nul

因此,我目前正在尝试获取以下内容,以简单地返回变量obj。它位于auth.js中

module.exports = {
  cas_login: function(ticket) {
    var obj;
    cas.validate(ticket, function(err, status, username) {
      if (err) {
        // Handle the error
        obj={status: false, username: null};
      } else {
        // Log the user in
        obj={status: status, username: username};
        }
      });
    if(obj){
      return obj;
    }
  }
};

然后,console.logauth.cas_loginticket将其作为测试调用;我知道一切都是正确链接的,因为auth.cas_登录只需返回{hello:ticket}即可工作,但是由于某些原因,cas.validate会导致问题。我不熟悉异步语言,并认为它可能与此有关

像这样的问题在S.O上经常出现。但是在问题结束之前,我将带您了解异步行为,因为您是新手

让我们运行cas\u登录。它有三种说法:

声明obj,初始化为未定义。 调用验证。这是异步运行的,这意味着当调度程序说可以运行时,执行将排队运行。但它现在无法运行,因为cas\U登录尚未完成。 如果obj返回obj。这里obj是未定义的,这是falsy,所以if语句被跳过。这意味着函数结束时不会碰到return语句。在JS中,这意味着函数返回未定义的。 您需要做的是使cas\u登录异步。你试图让它同步。将其定义为接受自己的回调,即处理值obj的回调。沿着这些未经测试的路线:

module.exports = {
  cas_login: function(ticket, callback) {
    cas.validate(ticket, function(err, status, username) {
      if (err) {
        callback({status: false, username: null});
      } else {
        callback({status: status, username: username});
      }
    });
  }
};

你的假设是正确的。对obj的赋值发生在回调内部以进行验证。但是您的返回obj发生在回调运行之前。那么,解决此问题的最佳方法是什么?