【发布时间】:2016-12-19 20:06:51
【问题描述】:
我编写了一个代码,用于在 Node.js 中并行运行插入查询,并且我也在使用 Promise.js。
但代码失败并引发“重复主键”条目的异常。
代码如下,
var Promise = require("promise");
var mySql = require("mysql");
var _ = require("underscore");
var connection = mySql.createConnection({
host : "localhost",
user : "root",
password : "rahul",
database : "testDb" //schema
});
connection.connect();
function insertDept(name){
return new Promise(fn);
function fn(resolve,reject){
getMaxDept().then(function(rows){
var deptId = rows[0]["DeptId"];
deptId = (_.isNull(deptId) === true) ? 125 : deptId;
var sql = "insert into departmentTbl values("+deptId+",'"+name+"')";
console.log(sql);
connection.query(sql,function(err,rows,fields){
if(err){
console.log(err);
return reject(err);
}else{
return resolve(rows);
}
});
}).catch(function(error){
return reject(error);
});
}//fn
}//insertDept
function getMaxDept(){
return new Promise(fn);
function fn(resolve,reject){
var sql = "select max(deptId) + 1 as 'DeptId' from departmentTbl";
connection.query(sql,function(err,rows,fields){
if(err){
console.log(err.stack);
return reject(err);
}else{
return resolve(rows);
}
});
}// fn
} //getMaxDept
function createDeptForAll(){
var promiseObj = [];
if(arguments.length > 0){
_.each(arguments,callback);
}else{
throw "No departments passed";
}
function callback(deptName){
promiseObj.push(insertDept(deptName))
}
return Promise.all(promiseObj);
}//createDeptForAll
createDeptForAll("Archiology","Anthropology").then(function(createDepartment){
createDepartment.then(function(rows){
console.log("Rows inserted "+rows["affectedRows"]);
}).catch(function(error){
console.log(error);
}).done(function(){
connection.end();
});
});
当我运行上面的代码代码时, 输出是
rahul@rahul:~/myPractise/NodeWebApp/NodeMySqlv1.0$ node queryUsingPromise02.js
insert into departmentTbl values(125,'Archiology')
insert into departmentTbl values(125,'Anthropology')
{ [Error: ER_DUP_ENTRY: Duplicate entry '125' for key 'PRIMARY'] code: 'ER_DUP_ENTRY', errno: 1062, sqlState: '23000', index: 0 }
由于部门 ID 是主键并且承诺并行运行, 第二部门的插入查询的主键失败。
如您所见,在任何插入查询之前,我获取部门的最大值 + 1。
如果上述查询失败,我分配'125'。
现在,我应该更改什么才能运行上面编写的代码。
我应该在数据库级别本身使用“插入前”触发器来计算“部门 ID”主键的下一个值,还是应该在自己的 Node.js 代码中执行某些操作?
【问题讨论】:
-
是否有任何理由没有将 deptId 设置为 MySQL 中的自动增量字段?我可能遗漏了一些东西,但我觉得这样可以解决你的问题,而且你根本不需要 getMaxDept() 函数。
标签: javascript node.js promise node-mysql