在循环中使用node-mysql插入数据

sat*_*god 4 node.js

我的代码如下:

var mysql= require('mysql');

var client = mysql.createClient({
    user: 'root',
    password: 'root',
    host: 'localhost'
});

client.query('USE sample');

for(var k=0;k<=100;k++)
{

    var sql="SELECT `id` FROM `data` WHERE `id`= ?";

    console.log(k);

    client.query(sql,[k],function(err,results,field){

        console.log("DATABASE "+k);
        if(results.length == 0) {

            var sql2="INSERT INTO `data` (`id`) VALUES (?);";

            client.query(sql2,[k],function(err,results,field){

            });

        }
    });

}

client.end();
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,结果如下:

1
2
3
...
100
Database 101
Database 101
Database 101
...
Database 101
Run Code Online (Sandbox Code Playgroud)

它既不会关闭数据库连接也不会插入任何数据.

我想在循环中插入数据.但在插入新记录之前,还需要检查它是否已经存在.

set*_*ien 6

回调函数的闭包通过引用绑定到变量k,而不是通过值绑定.这意味着,当您执行回调时,它们都会获得最新的k值(101).为了在创建闭包时绑定到当前k值,您需要添加一个新的变量作用域.也许是这样的:

for(var k=0;k<=100;k++) {
    var sql="SELECT `id` FROM `data` WHERE `id`= ?";
    console.log(k);
    (function () {
        var kCopy = k;
        client.query(sql,[kCopy],function(err,results,field){
            console.log("DATABASE "+kCopy);
            if(results.length == 0) {
                var sql2="INSERT INTO `data` (`id`) VALUES (?);";
                client.query(sql2,[kCopy],function(err,results,field){});
            }
        });
    }());
}
Run Code Online (Sandbox Code Playgroud)