使用Node.js和Tedious插入多个记录

时间:2015-11-16 09:42:36

标签: javascript sql node.js for-loop tedious

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

我正在使用Tedious来处理请求,而Tedious 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);
        });
    }
});

1 个答案:

答案 0 :(得分:3)

变量countfirstName的范围是全局的。到pool.acquire(函数执行时,for循环已完成,并且它正在插入最后一个客户两次。一种可能的解决方案是在for循环中放置一个匿名函数,例如: (虽然它不必是匿名的)

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