Sequelize hasOne报错

我有两个表,RolesUsers。现在查Users表的时候想LEFT JOIN Roles表,我用了以下代码:

include: [
  {
    association: model.Users.hasOne(model.Roles, {
      foreignKey: 'id',
      as: 'UserRoles',
    }),
  },
]

然后第一次请求没有问题,之后再请求同一个接口就报错了

stack: SequelizeAssociationError: You have used the alias UserRoles in two separate associations. Aliased associations must have unique aliases.
阅读 6.3k
3 个回答

重名原因不太清楚,但是as字段的值加上时间戳即可

根据调试观察,并且对比了一些例子(包括官方文档)中的使用方式。

hasOnehasMany等建立映射关系的方法,都是有全局性质的,可能是有副作用的

因此映射关系应该类似modle在运行时中只定义一次,而不应该在请求function中多次执行。

会报错的case

async function responseXXX(id) {
  return models.Users.findAll({
    where: { id },
    include: [{
      model.Users.hasOne(model.Roles, { // 每次执行都会重复定义这个关系,第一次响应是正常的,第二次就会报错
        foreignKey: 'id',
        as: 'UserRoles',
      }),
    }]
  })
}

正确的case


const UsersHasOneRoles = model.Users.hasOne(model.Roles, { 
   // 最外部的作用域就定义一下这个映射关系,这样运行周期里只会执行一次
   foreignKey: 'id',
   as: 'UserRoles',
}),

async function responseXXX(id) {
  return models.Users.findAll({
    where: { id },
    include: [{
      association: UsersHasOneRoles // 这里再传入他,这个对象只是类似一个工厂函数,实际查询的时候findAll会找到最新的结果
    }]
  })
}

可能有用的资料:

alias别名重复了。

推荐问题
宣传栏