我实际上在使用nodejs在mysql数据库中从数组中保存一些数据时遇到了问题。
这是我的代码
for (var i = 0; i < data.data.length; i++) {
var imageObject = data.data[i];
var url = imageObject.images.standard_resolution.url;
var id = imageObject.id;
var sql = 'SELECT COUNT(*) AS imageIDCount FROM images WHERE id = ?'
var ids
connection.query(sql, [id], function(err, rows, fields) {
console.log(rows[0].imageIDCount);
if (err) throw err;
if (rows[0].imageIDCount == 0) {
console.log(id + " doesn't exist"); // ### the ID at this point is always the last from that array
//insertImage(id, url);
} else {
// console.log("ID exists");
}
});
}
当我从带有请求框架的rest-api获得响应时,此代码运行。
所以我的问题是,我从count-query获得结果,并且没有具有特定id的元素,我总是得到相同的id。我认为那是因为我使用相同的变量&#34; id&#34;但我怎么能解决它?我希望有人可以帮助我。
答案 0 :(得分:2)
在这种情况下,您是Node异步事件循环的受害者。您正在执行同步for循环并定义id
:
for (var i = 0; i < data.data.length; i++) {
var id = imageObject.id;
}
如果您尝试使用id
执行某些操作,则可以使用普通的Javascript,但由于您使用的数据库模块是异步运行的,因此在您的第一个数据库查询完成之前,整个循环已经完成破坏id
的价值。
您需要重新编写函数才能异步行为,或使用node-async之类的东西来帮助。
以下是一个可能看起来如何的快速示例。请注意,我没有为您编写insertImage
函数;你还需要重写它以支持回调。
async.each(data.data, function(imageObject, callback) {
var sql = 'SELECT COUNT(*) AS imageIDCount FROM images WHERE id = ?'
connection.query(sql, [imageObject.id], function(err, rows, fields) {
if (err) callback(err);
if (rows[0].imageIDCount == 0) {
console.log(id + " doesn't exist");
insertImage(imageObject.id, imageObject.images.standard_resolution.url, function(err) {
callback(err); // fires the callback to async
})
} else {
console.log(id + " already exists");
callback(); // maybe you want an error here too?
}
});
}, function(err, results) {
// all of your db queries are completed
});