无法使用nodejs在mysql数据库中的数组中插入元素

时间:2015-12-16 18:00:22

标签: mysql node.js

我实际上在使用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;但我怎么能解决它?我希望有人可以帮助我。

1 个答案:

答案 0 :(得分:2)

在这种情况下,您是Node异步事件循环的受害者。您正在执行同步for循环并定义id

for (var i = 0; i < data.data.length; i++) {
    var id = imageObject.id;
}

如果您尝试使用id执行某些操作,则可以使用普通的Javascript,但由于您使用的数据库模块是异步运行的,因此在您的第一个数据库查询完成之前,整个循环已经完成破坏id的价值。

您需要重新编写函数才能异步行为,或使用之类的东西来帮助。

以下是一个可能看起来如何的快速示例。请注意,我没有为您编写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
});