【发布时间】:2018-01-07 00:46:13
【问题描述】:
我无法弄清楚为什么我无法从子调用中访问变量。我以前在一个独立的函数中有这个代码并且它可以工作,但是由于将它移动到我的 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(); }
});
}
【问题讨论】:
-
我们没有看到完整的功能。是否可以在同一个函数的其他地方使用 auth_session?
-
@NineBerry,不,它不在其他任何地方使用。在调用这两个函数之前,我尝试删除前面的
var并将auth_session定义为全局变量。但这也没有用。 -
使用全局变量实际上会让事情变得更糟。你试过用 let 代替 var 吗?
-
使用
let时出现此错误:SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode -
@NineBerry,实际上你的第一条评论是对的。在
// do some stuff部分中,我定义了var auth_session = ....,这导致内部查询范围根本不继承auth_session。