我正在使用npm sequelize库来存储MySQL。主键是使用shortid库生成的Task id。
什么是一个很好的Javascript模式来处理重复的id,在不太可能的情况下shortid给我一个重复的键?我想在捕获重复键错误时返回false,并且有一个外部while循环来重新尝试创建任务(使用新生成的id)。
这是一个非常难看的解决方案,那么有更好的方法吗?
Task.create({
id: shortid.generate(),
content: task.content,
deadline: task.deadline
}).catch(function(error) {
console.log('repeated id');
return false;
}).then(function() {
console.log('yay ok');
return true;
});
答案 0 :(得分:2)
你走在正确的轨道上。解决此问题的唯一方法是,如果重复旧ID,则实际生成新ID。要在代码中表示这一点,您可以将create
更改为递归函数,如下所示:
function createTask(task){
Task.create({
id: shortid.generate(),
content: task.content,
deadline: task.deadline
}).catch(function(error) {
console.log('repeated id');
createTask(task); // this will keep calling itself until it successfully creates the record with unique id
return false;
}).then(function() {
console.log('yay ok');
return true;
});
}
// now creating the task will look like:
createTask(task);
这肯定是一个乐观的递归函数,假设只有重复ID得到的错误,并且您的生成器最终将生成唯一ID。如果这些假设中的任何一个是假的,那么“可能”会卡住循环,在这种情况下,您将必须实现这些检查并有条件地中断递归。