节点'未定义'问题

时间:2014-11-11 08:00:30

标签: 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: null};
      } else {
        // Log the user in
        obj={status: status, username: username};
        }
      });
    if(obj){
      return obj;
    }
  }
};

然后通过“console.log(auth.cas_login(ticket))调用(作为测试);”我知道所有内容都已正确链接,因为auth.cas_login只会让它返回{hello:ticket},但由于某种原因,cas.validate会导致问题。我是异步语言的新手,并认为它可能与此有关。

1 个答案:

答案 0 :(得分:0)

这样的问题在S.O.上出现了很多。但在问题结束之前,我会引导您完成异步行为,因为您不熟悉它。

让我们运行cas_login。它有三个陈述:

  1. 声明obj,初始化为undefined
  2. 致电validate。这是异步运行的,这意味着当调度程序说它可以执行时,执行将排队等待运行。但它现在无法运行,因为cas_login尚未完成。
  3. if (obj) return obj。那么obj未定义,这是假的,因此跳过if语句。这意味着函数结束时没有遇到return语句。在JS中,这意味着函数返回undefined。
  4. 您需要做的是使cas_login异步。你试图让它同步。将其定义为采用自己的回调,处理值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});
          }
        });
      }
    };