我是使用Sequelize的新手,但遇到一个我不明白为什么会发生的问题。我正在尝试创建一个新用户,该用户的数据在两个表中定义。一个是用户表,其中包含一般用户的信息,例如名字,姓氏,电子邮件等。另一个表包含用户的设置,例如用户要使用的配色方案等。这些表的模型如下所示。
用户模型:
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('user', {
user_id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true,
allowNull: false
},
firstname: {
type: DataTypes.STRING,
allowNull: false,
},
lastname: {
type: DataTypes.STRING,
allowNull: false,
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: {
args: true,
},
},
password: {
type: DataTypes.STRING,
allowNull: false,
}
}
);
return User;
};
用户设置模型:
module.exports = (sequelize, DataTypes) => {
const UserSettings = sequelize.define('user_settings', {
user_id: {
type: DataTypes.INTEGER,
unique: true,
allowNull: false
},
wants_update_notification: {
type: DataTypes.BOOLEAN,
allowNull: false
},
color_scheme: {
type: DataTypes.INTEGER,
allowNull: false
}
});
UserSettings.associate = (models) => {
UserSettings.belongsTo(models.User, { foreignKey: 'user_id', as: 'user' });
};
return UserSettings;
}
现在,当我尝试创建新用户时,服务器通过端点的主体获取常规用户的信息。服务器使用此信息创建一个新用户。接下来,我将默认用户设置添加到创建的用户返回的对象中,然后尝试将数据插入用户设置表中,如下所示:
let theUser = await sequelizeConnection.models.user.create(req.body);
theUser.wants_update_notification = false;
theUser.color_scheme = 0;
await sequelizeConnection.models.user_settings.create(theUser);
但是,这将返回错误:user_settings.user_id cannot be null
。我发现这很奇怪,因为user_id由用户模型的create方法返回。如果我记录其中的内容,则theUser
可以清楚地看到存在user_id。这里发生了什么?
您正在尝试将want_update_notification和color_scheme添加到user
而不是user_settings
let theUser = await sequelizeConnection.models.user.create(req.body); // theUser is a user model instance
theUser.wants_update_notification = false; // here!
theUser.color_scheme = 0;
await sequelizeConnection.models.user_settings.create(theUser);
正确版本:
await sequelizeConnection.sequelize.transaction(async(transaction) => {
const createdUser = await sequelizeConnection.models.user.create(req.body, {transaction});
const userSettings = {
wants_update_notification: false,
color_scheme: 0,
user_id: createdUser.user_id, // Associate user with user_settings
};
await sequelizeConnection.models.user_settings.create(userSettings, {transaction});
});
我建议您使用它sequelize.transaction
来在数据创建失败的情况下进行回滚。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句