gpt4 book ai didi

JavaScript nodejs mysql 循环查询

转载 作者:可可西里 更新时间:2023-11-01 07:56:40 26 4
gpt4 key购买 nike

我现在有点懵。我是 nodejs 和 javaScript 的新手,无法弄清楚这一点。我想这是因为对 mysql 的查询的异步性质......

我做了一个例子来说明我的问题。我只想循环处理一些 sql 查询并对结果进行处理。为了这个例子,我只是打印出一些东西。我知道我可以使用像这样的单个 sql 查询 "SELECT id, name FROM player WHERE id IN (1,2,3,4,5)" 但这在实际应用程序中是不可能的我正在努力写作。

这是我的 nodejs app.js 的相关部分

var mysql = require("mysql");
var mysqlPool = mysql.createPool(conf.mysqlArbData);

for (var i = 0; i<5; i++){

mysqlPool.getConnection(function(err, connection) {

var detailSql = "SELECT id, name FROM player " +
"WHERE id = "+i;
if (err){
throw err;
}
connection.query(detailSql, function(err, detailRows, fields) {
connection.end();
console.log("detailSql="+detailSql);
if (err){
console.log("can't run query=" + detailSql +"\n Error="+err);
}
else{

console.log(detailRows[0].id + " " +detailRows[0].name);

}

});
});

};

现在输出:

web server listening on port 3000 in development mode
detailSql=SELECT id, name FROM player WHERE id = 5
5 Jyvaskyla
detailSql=SELECT id, name FROM player WHERE id = 5
5 Jyvaskyla
detailSql=SELECT id, name FROM player WHERE id = 5
5 Jyvaskyla
detailSql=SELECT id, name FROM player WHERE id = 5
5 Jyvaskyla
detailSql=SELECT id, name FROM player WHERE id = 5
5 Jyvaskyla

我的问题是,为什么我只得到 id=5 的数据库条目的结果?需要更改什么才能在回调中接收到每个单独的结果?

最佳答案

问题是 getConnection是异步的并且 Javascript 没有 block 作用域,这意味着到getConnection 的回调时被称为i变量将指向它在循环中的最后一个值(即 5)。

您可以使用技巧为循环的每一轮创建一个部分函数(将其视为已应用第一个参数的函数),它将传递 i 的当前值。作为 getConnection 的第一个参数回调:

for (var i = 0; i<5; i++) {
mysqlPool.getConnection(function(i, err, connection) {
...
}.bind(mysqlPool, i));
};

FWIW,您的代码将几乎立即打开到数据库的 5 个连接(并执行 5 个查询)(这就是异步 I/O 的工作方式)。这可能不是什么大问题,但如果 5 是值得意识到的。可能会更高:)

此外,for 循环将生成 [0, 1, 2, 3, 4] ,而在您的示例查询中,您编写了 WHERE id IN (1, 2, 3, 4, 5) .

关于JavaScript nodejs mysql 循环查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16068290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com