Javascript 使用Node.js插入多条记录,非常繁琐
我有一个customer对象数组,我希望将其插入SQL数据库。 从req数据中检索客户对象 我对请求使用了Teduous,为了同时拥有多个连接,使用了Teduous Connectionpool 当在对象上循环时,我在尝试插入时遇到一个错误,错误是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
{ [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));
}