nodejs:mysql无法访问连接查询callback中的全局variables

以下是我的代码

我从客户端JavaScript发送数据对象到这个函数的数据打印它的值

在socket.on中

在socket.on – > connection.query(SQL,[],函数(错误,行){数据打印在这里})

在socket.on – > connection.query(SQL,[],函数(错误,行){数据打印在这里}) – > connection.query(SQL,[],函数(错误,行){数据打印未定义})

socket.on('sendmessage', function (data) { var data = JSON.parse(data); console.log(data); if (data.cuserid != '' && users_connected.hasOwnProperty(data.cuserid) && fs.existsSync(users_connected[data.cuserid]['sessionfile'])) { sql = "update hired set echat='Y' where eid=? and jobid=? and jid=? and status in ('given','finished')"; connection.query(sql, [data.cuserid, data.jobid, data.userid], function (err, rows) {/*console.log(this.sql);*/ }); sql = "insert into chat_messages(fromid,toid,jobid,message,received_date) select ?,?,?,?,NOW() from hired where echat='Y' and jchat='Y' and jobid=? and jid in(?,?) and eid in(?,?) and status in ('given','finished')"; connection.query(sql, [data.cuserid, data.userid, data.jobid, data.message, data.jobid, data.cuserid, data.userid, data.cuserid, data.userid], function (err, rows) { console.log("dataretrieved : ", data); if (!err && users_connected[data.userid] != '') { socid = users_connected[data.userid]['socket']; sql = "select id as userid,username, userphoto from us_signup where id=?"; connection.query(sql, [data.userid], function (err, rows) { console.log(data); //prints undefined if (!err) { var data = { 'userphoto': rows[0].userphoto, 'username': rows[0].username, 'userid': rows[0].userid, 'cuserid': data.cuserid, 'message': data.message, 'jobid': data.jobid } io.to(socid).emit('message', JSON.stringify(data)); } }) } }); } }) 

您正在创build最深层次的新范围data

 if (!err) { var data = { ... } ... } 

这个variables被提升到包含函数的顶部,所以代码变成这样的代码:

 var data; // clobbers the existing `data` variable... console.log(data); // ...so here it will log `undefined`... if (!err) { data = { ... } // ...because it receives a value here. ... } 

解决scheme:

  • 不要在那里使用var
  • 开始使用let