如何将MySQL数据库的结果放入Node.js中的变量中?
我的node.js应用程序有问题。我正在连接数据库并获取数据如何将MySQL数据库的结果放入Node.js中的变量中?,mysql,json,node.js,Mysql,Json,Node.js,我的node.js应用程序有问题。我正在连接数据库并获取数据 let users = {}; let currentUser = "example"; // this variable changes every time a user connects connection.query('SELECT * FROM users WHERE name="'+currentUser+'"', function (err, result) { if (err) console.log(err);
let users = {};
let currentUser = "example"; // this variable changes every time a user connects
connection.query('SELECT * FROM users WHERE name="'+currentUser+'"', function (err, result) {
if (err) console.log(err);
users[currentUser] = result[0];
});
console.log(users[currentUser]);
当我尝试从函数内部console.log
查看结果[0]
时,它返回以下内容:
RowDataPacket {
n: 11,
id: 'VKhDKmXF1s',
name: 'user3',
status: 'online',
socketID: 'JbZLNjKQK15ZkzTXAAAB',
level: 0,
xp: 0,
reg_date: 2018-07-16T20:37:45.000Z }
我想将MySQL的结果放入用户中。例如
或类似的东西,但是当我尝试代码时,它返回未定义的。所以我尝试了console.log(users[currentUser].id)
作为示例,它显示了一个错误
TypeError: Cannot read property 'id' of undefined
那么,如何将结果中的数据放入变量users[currentUser]
中?connection.query是一个异步调用。在查询从db获取数据之前调用console.log。connection.query是一个异步调用。在查询从数据库获取数据之前调用console.log。因为您使用的是回调,所以您的console.log在结果从数据库返回之前发生。此外,您的代码中有一个类型user
->users
let users = {};
let currentUser = "example"; // this variable changes every time a user connects
connection.query('SELECT * FROM users WHERE name="'+currentUser+'"', function (err, result) {
if (err) console.log(err);
users[currentUser] = result[0];
console.log(users[currentUser]);
});
旁注:在使用此代码之前,请先研究“SQL注入”。您构建查询的方式为任何人访问您的数据库打开了大门。使用像squel.js
或knex.js
这样的库将帮助您避免这种情况
要解释事情按顺序发生的原因,请查看。因为您使用的是回调,所以您的控制台.log
在结果从数据库返回之前发生。此外,您的代码中有一个类型user
->users
let users = {};
let currentUser = "example"; // this variable changes every time a user connects
connection.query('SELECT * FROM users WHERE name="'+currentUser+'"', function (err, result) {
if (err) console.log(err);
users[currentUser] = result[0];
console.log(users[currentUser]);
});
旁注:在使用此代码之前,请先研究“SQL注入”。您构建查询的方式为任何人访问您的数据库打开了大门。使用像squel.js
或knex.js
这样的库将帮助您避免这种情况
要解释为什么事情会按顺序发生,请看
那么如何将结果中的数据放入变量users[currentUser]中呢
这正在发生。问题在于如何对其进行测试
正确的测试是在回调函数(err,result)
问题:用户[currentUser]
在该函数之外仍未定义
嗯,是和否。它在启动回调之前执行的代码中是未定义的
我该如何解决这个问题?
任何需要查询结果的操作都必须从回调函数中的执行,因为这是您确定数据存在的唯一代码位置
好吧,我需要在全局变量外部输入该数据。
您可以将查询数据粘贴到全局中,但这并不能解决时间问题
只有在定义并包含当前数据时才能访问该全局文件。这会引起很多挫折
如果不想调用一个或多个特定函数来处理查询数据
在回调中,另一种方法是使用nodejs来协调数据生成和数据消耗
另一种选择是不使用回调函数,而使用Promise
和/或async
/wait
,这两种功能都受到现代NodeJ的支持。此替代方案不涉及全局变量,但提供了不同的方法来编码某些操作需要等待其他操作的结果这一事实
那么如何将结果中的数据放入变量users[currentUser]中呢
这正在发生。问题在于如何对其进行测试
正确的测试是在回调函数(err,result)
问题:用户[currentUser]
在该函数之外仍未定义
嗯,是和否。它在启动回调之前执行的代码中是未定义的
我该如何解决这个问题?
任何需要查询结果的操作都必须从回调函数中的执行,因为这是您确定数据存在的唯一代码位置
好吧,我需要在全局变量外部输入该数据。
您可以将查询数据粘贴到全局中,但这并不能解决时间问题
只有在定义并包含当前数据时才能访问该全局文件。这会引起很多挫折
如果不想调用一个或多个特定函数来处理查询数据
在回调中,另一种方法是使用nodejs来协调数据生成和数据消耗
另一种选择是不使用回调函数,而使用Promise
和/或async
/wait
,这两种功能都受到现代NodeJ的支持。此替代方案不涉及全局变量,但提供了不同的方式来编码某些操作需要等待其他操作的结果这一事实。是否有办法控制台。记录数据?是的。在回调中执行此操作。发生的情况是节点执行所有顶级代码,然后将回调放在“我应该稍后调用此”队列中,因此当它执行console.log时,回调尚未执行。我是否有办法console.log
数据?是的。在回调中执行此操作。发生的情况是节点执行所有顶级代码,然后将回调放入“我应该稍后调用此”队列中,因此当它执行console.log时,回调尚未执行。类似问题,不同代码:和类似问题,不同代码:和