2013-06-19 107 views
1

我正在尝试为流星进行身份验证,并对LDAP服务器进行身份验证。我需要注册登录处理器(输入到​​)函数返回的id刚登录的用户的。节点光纤与流星的故障

我想就在于我已经创建,getUserId的纤维,它没有返回的问题id就像我想要的那样。我知道它必须在光纤中,否则流星会​​生气并引发错误。即使在yield之前的日志显示id未定义,getUserId.run()始终返回未定义。

任何帮助将不胜感激,谢谢!

Accounts.registerLoginHandler(function(loginRequest) { 

    console.log("In login handler"); 

    return auth.authenticate(loginRequest.username, loginRequest.password, function(err, ldap_user) { 

     if (err){ 
      // ldap authentications was failed 
      console.log("Login failed"); 
      return undefined; 
     } 
     else { 
      // authentication was successful 
      console.log("Login success"); 

      // extracting team name from ldap record 
      var equals = ldap_user.memberOf.indexOf("="); 
      var comma = ldap_user.memberOf.indexOf(","); 
      var team_name = ldap_user.memberOf.slice(equals+1,comma); 

      // add user if they don't already exist 

      var getUserId = Fiber(function() { // Meteor code must be ran within a fiber 
       var id = null; 
       var user = Meteor.users.findOne({username: loginRequest.username}); 
       if(!user) { 

        // insert user and kick back id 
        id = Meteor.users.insert({username: loginRequest.username, 
               profile : {team : team_name} 
              }); 
        console.log('no user found, creating' + id); 

       } else { 

        id = user._id; 
        console.log('user found, returning id' + id); 

       } 

       console.log('id: '+id); 
       Fiber.yield(id); // return id 
      }); 

      // send logged in users if by executing the fiber 
      return {id: getUserId.run()}; 
     } 
    }); 
}); 

回答

0

我认为这个问题是有关,而不是需要使用Meteor.bindEnvironment控制(环境)变量和纤维的使用范围。

关于这个问题的一个很好的三个步骤教程这里找到:

  1. https://www.eventedmind.com/feed/nodejs-introducing-fibers
  2. https://www.eventedmind.com/feed/meteor-dynamic-scoping-with-environment-variables
  3. https://www.eventedmind.com/feed/meteor-what-is-meteor-bindenvironment

我对你的代码采取会是这样的(这在一个类似的问题为我工作):

Accounts.registerLoginHandler(function(loginRequest) { 

    console.log("In login handler"); 

    var boundAuthenticateFunction = Meteor.bindEnvironment(function(err, ldap_user) { 
     if (err){ 
      // ldap authentications was failed 
      console.log("Login failed"); 
      return undefined; 
     } 
     else { 
      // authentication was successful 
      console.log("Login success"); 

      // extracting team name from ldap record 
      var equals = ldap_user.memberOf.indexOf("="); 
      var comma = ldap_user.memberOf.indexOf(","); 
      var team_name = ldap_user.memberOf.slice(equals+1,comma); 

      // add user if they don't already exist 

      var id = null; 
      var user = Meteor.users.findOne({username: loginRequest.username}); 
      if(!user) { 

       // insert user and kick back id 
       id = Meteor.users.insert({username: loginRequest.username, 
              profile : {team : team_name} 
             }); 
       console.log('no user found, creating' + id); 

      } else { 

       id = user._id; 
       console.log('user found, returning id' + id); 

      } 

      console.log('id: '+id); 

      return {id: id}; 
     } 
    }, function(e){throw e;}); 

    return auth.authenticate(loginRequest.username, loginRequest.password, boundAuthenticateFunction); 
}); 

请注意,上面的代码示例未经测试...