JavaScript nodejs mysql与循环中的查询
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JavaScript nodejs mysql与循环中的查询,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1947字,纯文字阅读大概需要3分钟。
内容图文
我觉得现在有点傻瓜.我对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没有块作用域,这意味着在调用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与循环中的查询全部内容,希望文章能够帮你解决JavaScript nodejs mysql与循环中的查询所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。