如何使用mysql包从nodejs获取结果?
首先,我连接数据库并选择数据库:如何使用mysql包从nodejs获取结果?,mysql,node.js,Mysql,Node.js,首先,我连接数据库并选择数据库: var defaultOptions = { user: "root", pwd:'admin', db:"britcham_dev_local", server:"local", // Maybe we don't need this variable. }; var client = new Client(); client.user = defaultOptions.user; client.password = defa
var defaultOptions = {
user: "root",
pwd:'admin',
db:"britcham_dev_local",
server:"local", // Maybe we don't need this variable.
};
var client = new Client();
client.user = defaultOptions.user;
client.password = defaultOptions.pwd;
client.connect(function (error, results) {
//
});
client.query('USE ' + defaultOptions.db, function (error, results) {
//
});
其次,我使用客户端对象进行查询:
var self = this;
var this.users;
client.query("SELECT * FROM users", function (error, results, fields) {
if (error) {
//
}
if (results.length > 0) {
self.users = results;
}
});
console.log(this.users);
这没什么输出???为什么???既然node.js是非阻塞和异步的,那么在这段代码中:
client.query("SELECT * FROM users", function (error, results, fields) {
if (error) {
//
}
if (results.length > 0) {
self.users = results;
}
});
console.log(this.users);
当您试图将DB中的数据登录到控制台时,它可能还没有加载到users变量中。如果在查询中执行console.log操作,则可以将其签出,例如:
client.query("SELECT * FROM users", function (error, results, fields) {
if (error) {
//
}
if (results.length > 0) {
console.log(results);
}
});
function query(sql, callback) {
client.query(sql, function (error, results, fields) {
if (error) {
//
}
if (results.length > 0) {
callback(results);
}
});
}
query("SELECT * FROM users", function(results) {
self.users = results;
console.log(self.users);
});
要在操作完成时将结果传递到变量中,可以将客户端DB调用包装到带有回调参数的函数中,并在调用回调时设置变量,例如:
client.query("SELECT * FROM users", function (error, results, fields) {
if (error) {
//
}
if (results.length > 0) {
console.log(results);
}
});
function query(sql, callback) {
client.query(sql, function (error, results, fields) {
if (error) {
//
}
if (results.length > 0) {
callback(results);
}
});
}
query("SELECT * FROM users", function(results) {
self.users = results;
console.log(self.users);
});
以上代码只是一个概念。建议的答案与此有什么不同
var self = this;
var this.users;
client.query("SELECT * FROM users", function (error, results, fields) {
if (error) {
//
}
if (results.length > 0) {
self.users = results;
console.log(this.users);
}
});
我可能是错的,这与建议的答案没有什么不同,因为它会在我们从数据库返回数据之前写入控制台
建议的答案似乎只是添加了另一个功能?连接和选择数据库时是否收到错误?一个小评论,但您说数据库中的数据可能未加载。。。。数据实际上永远不会在那里,对吗?因为节点中只有一个执行线程,并且该线程在console.logthis.users被调用之前不可用于执行回调called@Geoff:从DB中提取数据后,数据将在那里,但在原始代码中调用console.log时,users变量仍然为空。例如,如果console.log操作被包装在setTimeout中,那么用户应该包含来自DB的结果。是的,对不起,这并不意味着永远不会,永远不会-只是在console.log调用之前它永远不会在那里。换句话说,这不是一个竞争条件,因为只有一个线程。