2016-12-16 24 views
0

Node.jsの非同期性に問題がありますか?ノードはセッションIDを取得できません

var SessionID, Session; 
IO.sockets.on('connection', function (client) { 
    SessionID = client.handshake.headers.cookie; 
    Session = GetSession(SessionID); 
    console.log(Session); // here, Session is all the undefined values 
}); 

その後GetSession()関数として示されている:私はそうのように、Memcacheの経由でPHPのセッションをフェッチしているコードの一部を持っている

function GetSession(SessionID) { 
    var Session = []; 
    // Define a default value for all Session values so undefined warnings aren't thrown for non-members 
    Session = []; 
    Session['MemberID'] = 0; 
    Session['MemberEmail'] = undefined; 
    Session['MemberPass'] = undefined; 

    // Make sure SessionID has been stripped down to just PHP Session ID 
    if (SessionID.split(';').length > 1) { 
     var parts = SessionID.split(';'); 
     var vals = []; 
     var thisPart, subParts; 
     for(var k = 0; k < parts.length; k++) { 
      thisPart = parts[k]; 
      if (thisPart.indexOf('PHPSESSID') >= 0) { 
       subParts = thisPart.split('='); 
       if (subParts.length > 1) 
        SessionID = subParts[1]; 
      } 
     } 
    } 

    // Get session vars from Memcache 
    MemCache.get('Session-'+SessionID, function(err,result){ 
     Session = JSON.parse(result); 
     console.log(Session); // here, Session prints the correct values 
    }); 

    return Session; 
} 

Sessionに依存しているすべての私のコードを投げ議論GetSession()関数に渡されたコールバックに変換されますが、それは不必要に乱雑です。

答えて

0

はい、非同期関数に問題があります。

GetSessionにコールバックを追加する必要があります。

var SessionID, Session; 
IO.sockets.on('connection', function (client) { 
    SessionID = client.handshake.headers.cookie; 
    Session = GetSession(SessionID, function (error, result) { 
    console.log(result); // here, Session 
    }); 

}); 


function GetSession(SessionID, cb) { 
    var Session = []; 
    // Define a default value for all Session values so undefined warnings aren't thrown for non-members 
    Session = []; 
    Session['MemberID'] = 0; 
    Session['MemberEmail'] = undefined; 
    Session['MemberPass'] = undefined; 

    // Make sure SessionID has been stripped down to just PHP Session ID 
    if (SessionID.split(';').length > 1) { 
    var parts = SessionID.split(';'); 
    var vals = []; 
    var thisPart, subParts; 
    for(var k = 0; k < parts.length; k++) { 
     thisPart = parts[k]; 
     if (thisPart.indexOf('PHPSESSID') >= 0) { 
     subParts = thisPart.split('='); 
     if (subParts.length > 1) 
      SessionID = subParts[1]; 
     } 
    } 
    } 

    // Get session vars from Memcache 
    MemCache.get('Session-'+SessionID, function(err,result){ 
    if(err){ 
     return cb(err); 
    } 
    Session = JSON.parse(result); 
    console.log(Session); 
    return cb(null, Session);//First arg for Error 
    }); 

} 

または約束

var SessionID, Session; 
 
IO.sockets.on('connection', function (client) { 
 
    SessionID = client.handshake.headers.cookie; 
 

 
    GetSession(SessionID) 
 
     .then(function (result) { 
 
      Session = result; 
 
      console.log(result); // here, Session is all the undefined values 
 
     }) 
 
     .catch(function (error) { 
 
      console.log(error); 
 
     }); 
 
}); 
 

 

 
function GetSession(SessionID) { 
 
    return new Promise(function (resolve, reject) { 
 
     var Session = []; 
 
     // Define a default value for all Session values so undefined warnings aren't thrown for non-members 
 
     Session = []; 
 
     Session['MemberID'] = 0; 
 
     Session['MemberEmail'] = undefined; 
 
     Session['MemberPass'] = undefined; 
 

 
     // Make sure SessionID has been stripped down to just PHP Session ID 
 
     if (SessionID.split(';').length > 1) { 
 
      var parts = SessionID.split(';'); 
 
      var vals = []; 
 
      var thisPart, subParts; 
 
      for (var k = 0; k < parts.length; k++) { 
 
       thisPart = parts[k]; 
 
       if (thisPart.indexOf('PHPSESSID') >= 0) { 
 
        subParts = thisPart.split('='); 
 
        if (subParts.length > 1) 
 
         SessionID = subParts[1]; 
 
       } 
 
      } 
 
     } 
 

 
     // Get session vars from Memcache 
 
     MemCache.get('Session-' + SessionID, function (err, result) { 
 
      if(err){ 
 
       return reject(error); 
 
      } 
 
      Session = JSON.parse(result); 
 
      console.log(Session); // here, Session prints the correct values 
 
      return resolve(Session); 
 
     }); 
 
    }); 
 
}

でそれを行います
関連する問題