Javascript 使用Node.js插入多条记录,非常繁琐

Javascript 使用Node.js插入多条记录,非常繁琐,javascript,sql,node.js,for-loop,tedious,Javascript,Sql,Node.js,For Loop,Tedious,我有一个customer对象数组,我希望将其插入SQL数据库。 从req数据中检索客户对象 我对请求使用了Teduous,为了同时拥有多个连接,使用了Teduous Connectionpool 当在对象上循环时,我在尝试插入时遇到一个错误,错误是 { [RequestError: Violation of PRIMARY KEY constraint `'PK__Customer__A4AE64D873A5400C'. Cannot insert duplicate key in object

我有一个customer对象数组,我希望将其插入SQL数据库。 从req数据中检索客户对象

我对请求使用了Teduous,为了同时拥有多个连接,使用了Teduous Connectionpool

当在对象上循环时,我在尝试插入时遇到一个错误,错误是

{ [RequestError: Violation of PRIMARY KEY constraint `'PK__Customer__A4AE64D873A5400C'. Cannot insert duplicate key in object 'dbo.Customer'. The duplicate key value is (2).]`
请注意,此时我在req中只发送了3个对象。在我看来,这只是最后一个被处理和插入的对象。但是,由于我还不熟悉Node.js,所以我无法发现我的错误。有什么建议吗

router.post('/',jsonParser, function(req, res) {


var customers = req.body.customers;
var companies = req.body.companies;

var Connection = require('tedious').Connection;
var Request = require('tedious').Request;
var TYPES = require('tedious').TYPES;
var config = {
    userName: '*************',
    password: '*************',
    server: '***********.database.windows.net',
    // When you connect to Azure SQL Database, you need these next options.
    options: {encrypt: true, database: '*******'}
};

var poolConfig = {
    min: 1,
    max: 3,
    log: true
};

var pool = new ConnectionPool(poolConfig, config);

    for (var i = 0; i < customers.length; i++) {

        console.log('Inserting '+customers[i].firstname);
        var firstname = customers[i].firstname;
        var count = i;


        pool.acquire(function (err, connection) {
            if (err)
                console.error(err);



            //use the connection as normal
            var request = new Request("INSERT INTO dbo.Customer" +
                " (Firstname,CustomerId)" +
                "VALUES" +
                " (@Firstname,@CustomerId);", function (err, rowCount) {
                if (err)
                    console.error(err);

                console.log('rowCount: ' + rowCount);


                //release the connection back to the pool when finished
                connection.release();
            });

            request.addParameter('Firstname', TYPES.VarChar,firstname);
            request.addParameter('CustomerId', TYPES.Int, count);


            request.on('row', function (columns) {
                console.log('value: ' + columns[0].value);
            });

            connection.execSql(request);
        });

        pool.on('error', function (err) {
            console.error(err);
        });
    }
});
router.post('/',jsonParser,函数(req,res){
var客户=请求主体客户;
var公司=所需实体公司;
var Connection=require(‘冗长’)。连接;
var Request=require(‘冗长’)。Request;
变量类型=需要(‘冗长’)。类型;
变量配置={
用户名:'************',
密码:'************',
服务器:'*********.database.windows.net',
//当您连接到Azure SQL数据库时,您需要以下选项。
选项:{encrypt:true,数据库:'******'}
};
var poolConfig={
民:1,,
最高:3,
日志:对
};
var pool=新连接池(poolConfig,config);
对于(变量i=0;i
变量的范围
count
firstName
是全局的。当
pool.acquire(
函数get执行时,for循环已经完成,并且正在插入最后一个客户两次。一个可能的解决方案是在for循环中放置一个匿名函数,例如(它不必是匿名的)

for(var i=0;i
for (var i = 0; i < customers.length; i++) {
    (function(count, firstName) {
       ...do insert here...
    }(i, customers[i].firstname));
}