Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用mysql包从nodejs获取结果?_Mysql_Node.js - Fatal编程技术网

如何使用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调用之前它永远不会在那里。换句话说,这不是一个竞争条件,因为只有一个线程。