【问题标题】:How to get the results from nodejs using mysql package?如何使用 mysql 包从 nodejs 获取结果?
【发布时间】:2011-08-23 07:50:47
【问题描述】:

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

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

什么都没有输出???为什么??

【问题讨论】:

  • 连接和选择数据库时是否收到错误消息?

标签: mysql node.js


【解决方案1】:

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

以上代码只是一个概念。

【讨论】:

  • 一个小评论,但你说“来自数据库的数据可能没有加载......”。数据实际上永远不会在那里,对吗? (因为节点中只有一个执行线程,并且在调用 console.log(this.users) 之前该线程无法执行回调)
  • @Geoff:从数据库中获取数据后,数据将在那里,但在调用 console.log 时(在原始代码中),用户变量仍然为空。例如,如果 console.log 操作包含在 setTimeout 中,那么用户应该包含来自 DB 的结果。
  • 是的,抱歉,这并不意味着永远不会——只是在 console.log 调用之前它永远不会存在。换句话说,它不是竞争条件(因为只有一个线程)。
【解决方案2】:

建议的答案与此有何不同?

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

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

建议的答案似乎只是添加另一个功能?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 2015-01-21
    • 2019-03-27
    • 1970-01-01
    • 2015-07-26
    • 2017-04-25
    相关资源
    最近更新 更多