如何使用 Sequelize 6(和 7?)cli 生成的模型在连接模型中引用模型
How to reference models in junction model with Sequelize 6 (and 7?) cli generated models
我有一个非常简单的权限管理结构,其中我有 table 个用户和 table 个角色以及它们之间的多对多映射。这是在设置 Sequelize 的“旧”方式中工作。但是,我将要添加一些更复杂的东西,并转向定义模型的 cli/migration 模型。我想我应该先让我现有的东西以新的方式工作。
据我了解,在生成阶段无法将关联信息传递给 CLI,因此您必须手动返回并添加关联。此外,当使用此方法而不是 sync
时,您还必须为结点 table 创建一个单独的迁移文件。这可以通过生成命令来促进,但同样需要手动配置。
我已经“完成”了所有这些,因此 db:migrate
有效;但是,当我尝试在 Node.
中实际使用它时,我 运行 遇到了错误
这是 ./models
中的(修改过的)文件:
role.js:
'use strict';
const {
Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class Role extends Model {
static associate(models) {
models.Role.belongsToMany(models.User, {
through: models.UserRole
})
}
}
Role.init({
name: DataTypes.STRING
}, {
sequelize,
modelName: 'Role',
});
return Role;
};
user.js:
'use strict';
const {
Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class User extends Model {
static associate(models) {
models.User.belongsToMany(models.Role, {
through: models.UserRole
})
}
}
User.init({
username: DataTypes.STRING,
email: DataTypes.STRING,
password: DataTypes.STRING
}, {
sequelize,
modelName: 'User',
});
return User;
};
用户role.js:
'use strict';
const {
Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class UserRole extends Model {
static associate(models) {
// define association here
}
}
UserRole.init({
userId: {
type: DataTypes.INTEGER,
references: {
model: User, // <--- this is the complaint
key: 'id'
}
},
roleId: {
type: DataTypes.INTEGER,
references: {
model: Role,
key: 'id'
}
}
}, {
sequelize,
modelName: 'UserRole',
});
return UserRole;
};
这些都是用自动生成的index.js
读入的。
当我用 nodemon
启动时,它会抱怨
userrole.js:20
model: User,
^
ReferenceError: User is not defined
我尝试将该行修改为 model: models.User
,但随后它抱怨 ReferenceError: models is not defined
。
我确定我在这里遗漏了一些非常简单的东西,但是,我如何将这些引用添加到结点的模型文件中?table?
FWIW,这是
sequelize@6.16.0
node v14.17.3
我在开发环境中使用 sqlite 作为方言。
最好删除 references
选项并在 associate
中定义所有链接:
static associate(models) {
UserRole.belongsTo(models.User, { foreignKey: 'userId' });
UserRole.belongsTo(models.Role, { foreignKey: 'roleId' });
}
我有一个非常简单的权限管理结构,其中我有 table 个用户和 table 个角色以及它们之间的多对多映射。这是在设置 Sequelize 的“旧”方式中工作。但是,我将要添加一些更复杂的东西,并转向定义模型的 cli/migration 模型。我想我应该先让我现有的东西以新的方式工作。
据我了解,在生成阶段无法将关联信息传递给 CLI,因此您必须手动返回并添加关联。此外,当使用此方法而不是 sync
时,您还必须为结点 table 创建一个单独的迁移文件。这可以通过生成命令来促进,但同样需要手动配置。
我已经“完成”了所有这些,因此 db:migrate
有效;但是,当我尝试在 Node.
这是 ./models
中的(修改过的)文件:
role.js:
'use strict';
const {
Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class Role extends Model {
static associate(models) {
models.Role.belongsToMany(models.User, {
through: models.UserRole
})
}
}
Role.init({
name: DataTypes.STRING
}, {
sequelize,
modelName: 'Role',
});
return Role;
};
user.js:
'use strict';
const {
Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class User extends Model {
static associate(models) {
models.User.belongsToMany(models.Role, {
through: models.UserRole
})
}
}
User.init({
username: DataTypes.STRING,
email: DataTypes.STRING,
password: DataTypes.STRING
}, {
sequelize,
modelName: 'User',
});
return User;
};
用户role.js:
'use strict';
const {
Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class UserRole extends Model {
static associate(models) {
// define association here
}
}
UserRole.init({
userId: {
type: DataTypes.INTEGER,
references: {
model: User, // <--- this is the complaint
key: 'id'
}
},
roleId: {
type: DataTypes.INTEGER,
references: {
model: Role,
key: 'id'
}
}
}, {
sequelize,
modelName: 'UserRole',
});
return UserRole;
};
这些都是用自动生成的index.js
读入的。
当我用 nodemon
启动时,它会抱怨
userrole.js:20
model: User,
^
ReferenceError: User is not defined
我尝试将该行修改为 model: models.User
,但随后它抱怨 ReferenceError: models is not defined
。
我确定我在这里遗漏了一些非常简单的东西,但是,我如何将这些引用添加到结点的模型文件中?table?
FWIW,这是
sequelize@6.16.0
node v14.17.3
我在开发环境中使用 sqlite 作为方言。
最好删除 references
选项并在 associate
中定义所有链接:
static associate(models) {
UserRole.belongsTo(models.User, { foreignKey: 'userId' });
UserRole.belongsTo(models.Role, { foreignKey: 'roleId' });
}