用于处理JavaScript中重复主键的模式

时间:2015-09-23 05:51:55

标签: javascript mysql node.js sequelize.js

我正在使用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;
        });

1 个答案:

答案 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。如果这些假设中的任何一个是假的,那么“可能”会卡住循环,在这种情况下,您将必须实现这些检查并有条件地中断递归。