如何使用mysql包从nodejs获取结果?

5

首先,我连接数据库并选择数据库:

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);

为什么没有任何输出?这是为什么?


1
当您连接并选择数据库时,是否收到错误提示? - yojimbo87
2个回答

7

由于Node.js是非阻塞和异步的,因此在以下代码中:

client.query("SELECT * FROM users", function (error, results, fields) {
    if (error) {
        //
    }
    if (results.length  > 0) {
        self.users = results;
    }
});

console.log(this.users);

当你尝试将来自数据库的数据记录到控制台中时,这些数据可能还没有被正确地加载到用户变量中。你可以在查询内部执行console.log操作来检查,例如:

client.query("SELECT * FROM users", function (error, results, fields) {
    if (error) {
        //
    }
    if (results.length  > 0) {
        console.log(results);
    }
});

当操作完成后,您可以将结果传递到变量中,方法是将客户端DB调用包装在带有回调参数的函数中,并在调用回调时设置变量,例如:

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中的数据可能没有加载..."。实际上,数据永远不会在那里,对吧?(因为在节点中只有一个执行线程,并且该线程在调用console.log(this.users)之后才可用于执行回调函数) - Geoff Chappell
@Geoff:数据将在从数据库中获取后存在,但在调用console.log时(在原始代码中),用户变量仍为空。如果将console.log操作包装在setTimeout中,那么用户应该包含来自数据库的结果。 - yojimbo87
是的,抱歉,我并不是想说永远不会出现 -- 只是在 console.log 调用之前它永远不会存在。换句话说,这不是竞态条件(因为只有一个线程)。 - Geoff Chappell

0

这个建议的答案和这个有什么不同?

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);
    }
});

我可能错了,这与建议的答案并没有什么不同,因为它只有在我们从数据库中取回数据后才会将其写入控制台。

建议的答案似乎只是添加了另一个函数?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接