在嵌套异步调用中从父级访问变量

时间:2018-01-07 00:46:13

标签: node.js scope

我无法弄清楚为什么我无法从子呼叫中访问变量。我以前在独立的函数中使用了这个代码并且它有效,但是因为它将它移动到我的websocket的主线程中它没有。

问题是auth_session可以在第一个查询范围中访问,但由于某种原因,即使它是一个孩子,也不会在第二个查询范围内访问。

 mysqlconn.query('SELECT * FROM auth_sessions WHERE session_id = ? AND session_name = ? AND (expires > ? OR expires = 0) LIMIT 1', [cookies.SESSION_ID, cookies.SESSION_NAME, time()], function(err, results, fields) {
  if (err) { throw err; }
    if (results.length == 1) {
      var auth_session = results[0];
      if (md5(request.httpRequest.headers['user-agent'] + (request.httpRequest.headers['accept-encoding'] + request.httpRequest.headers['accept-language'])) == auth_session.fingerprint) {
        mysqlconn.query('SELECT * FROM users WHERE id = ? LIMIT 1', [auth_session.uid], function(err, results, fields) { // auth_session is defined here (I have checked using console.log() too)
          if (err) { throw err; }
          if (results.length === 1) {
            var userinfo = results[0];
            if (auth_session.session === 1) { // throws: TypeError: Cannot read property 'session' of undefined     
              mysqlconn.query('UPDATE auth_sessions SET expires = ? WHERE id = ? LIMIT 1', [time() + SESSION_TIMEOUT, auth_session.id]);
            }
            // do some stuff with variables inside of userinfo
          } else { reject_request(); }
        });
      } else { reject_request(); }
    } else { reject_request(); }
  });
}

1 个答案:

答案 0 :(得分:0)

这个答案应该归功于@NineBerry,但没有在评论之外发布答案。

问题是在最内层的循环内部,有一个声明隐藏在date_format的某处。这意味着变量var auth_session = ...从未被循环开始继承,因此在循环内部定义之前是未定义的。

通过移除auth_session最内层函数,然后继承该变量,因此能够在更大的范围内访问和更改它。