我无法弄清楚为什么我无法从子呼叫中访问变量。我以前在独立的函数中使用了这个代码并且它有效,但是因为它将它移动到我的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(); }
});
}
答案 0 :(得分:0)
这个答案应该归功于@NineBerry,但没有在评论之外发布答案。
问题是在最内层的循环内部,有一个声明隐藏在date_format
的某处。这意味着变量var auth_session = ...
从未被循环开始继承,因此在循环内部定义之前是未定义的。
通过移除auth_session
最内层函数,然后继承该变量,因此能够在更大的范围内访问和更改它。