如何将mysql数据库的结果放入node.js的变量中?

ezykj2lf  于 2021-07-11  发布在  Mysql
关注(0)|答案(3)|浏览(444)

我的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);
  users[currentUser] = result[0];
});
console.log(users[currentUser]);

当我试着 console.log 这个 result[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的结果放到 users.example 或者类似的,但是当我尝试代码时它会返回 undefined . 所以我试过了 console.log(users[currentUser].id) 作为一个例子,它显示了一个错误

TypeError: Cannot read property 'id' of undefined

那么如何将结果中的数据放入变量中呢 users[currentUser] ?

muk1a3rh

muk1a3rh1#

因为你正在使用回调,你的 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 会帮助你避免这种情况。
为了解释为什么事情按顺序发生,请看一下javascript事件循环。

oknwwptz

oknwwptz2#

那么如何将结果中的数据放入变量users[currentuser]中呢?
正在发生。问题是如何测试它。
正确的测试方法是 console.log 在回调中 function(err, result) ```
function (err, result) {
if (err) console.log(err);
users[currentUser] = result[0];
console.log(users[currentUser]);
});

问题: `users[currentUser]` 在该函数之外仍然没有定义
好吧,是和否。它在调用回调之前执行的代码中是未定义的。
我该怎么解决呢?
任何需要查询结果的操作都必须在回调函数中执行,因为只有在回调函数中才能确定数据是否存在。
好吧,我需要一个全局变量的外部数据。
您可以将查询数据粘贴到全局中,但这并不能解决仅在全局定义并包含当前数据时访问该全局的计时问题。那会引起很多挫折。
如果不想调用一个或多个特定函数来处理回调中的查询数据,另一种方法是使用nodejs eventemitter来协调数据生成和数据消耗。
另一种选择是不使用回调函数,而是使用 `Promise` 和/或 `async` / `await` ,两者都由现代nodejs支持。这个替代方案不涉及全局变量,但是提供了不同的方法来编码这样一个事实,即一些操作需要等待其他操作的结果。
e4eetjau

e4eetjau3#

connection.query是一个异步调用。在查询从数据库获取数据之前,将调用console.log。

相关问题