gpt4 book ai didi

javascript - Sequelize 如何正确创建具有约束的用户数据?

转载 作者:行者123 更新时间:2023-12-03 22:19:31 24 4
gpt4 key购买 nike

这个问题并不寻求作为“最佳实践”的答案,而是与我下面的内容相比更合适的方式。

基本上我有一个 User 模型/表,它与 UserScore 模型/表有关联。

User.belongsTo(models.UserScore, { 
foreignKey: {
name: "userScoreId",
allowNull: false,
defaultValue: 1
},
as: "score",
targetKey: "id"
})

然后 UserScore 模型定义为:
'use strict';
module.exports = (sequelize, DataTypes) => {
const UserScore = sequelize.define('UserScore', {
id: { type: DataTypes.INTEGER, allowNull: false, autoIncrement: true, unique: true, primaryKey: true },
score: DataTypes.INTEGER,
coins: DataTypes.INTEGER
}, {});
UserScore.associate = function (models) {
UserScore.hasMany(models.User, {
foreignKey: "userScoreId",
sourceKey: "id"
})
};
return UserScore;
};

我的 问题 是我觉得我在下面错误地执行了我的 Sequelize 查询。

首先,我创建 UserScore 假设我知道 userId ,使用 Facebook 可以工作,因为我可以从 Facebook 获取 id。但不是使用电子邮件和密码 注册 !这是 的第一个问题

在创建 UserScore 之后,我再创建一个 User 数据。就是觉得这太不对劲了。虽然它在使用 Facebook 登录时效果很好,因为就像我说的,我有用于创建 userIdUserScore ,但是如果我没有它怎么办(例如,使用电子邮件和密码注册)?

编辑:问题与关于约束的错误有关,因为我尝试制作 User 数据而不先制作 UserScore。我现在无法重现它,因为我已经使用 UUId ( https://www.npmjs.com/package/uuid-int ) 修复了它。

AuthController.js
module.exports = {
// SIGN UP WITH EMAIL AND PASSWORD
signup: async (req, res, next) => {
const email = req.body.email
const password = req.body.password

if (!email || !password) {
return res.status(403).send({
message: "Error! Required parameters are: {email} and {password}."
})
}

// Check if there is a user with the same email
db.User.findOne({
where: { email: email }
})
.then(data => {
if (data) {
return res.status(409).send({
message: "Email is already in use."
})
}

// Create a new user...
const newUser = {
fbId: null,
email: email,
firstName: null,
lastName: null,
photoUrl: null
}

const newUserScore = {
score: 0,
userId: id, //// <---------- NO IDEA!!!
coins: 0
}

db.UserScore.create(newUserScore)
.then(userScoreData => {

db.User.create(newUser)
.then(data => {
console.log("Created new user! ✅")
// Generate the token
const token = signToken(newUser)
// Respond with token
res.status(200).json({ token })
})
.catch(err => {
console.log("Error creating a new user!!!." + err)
return res.status(409).send({
message: "An error has occured while creating a new user"
})
})

})
.catch(err => {
console.log("Error creating user score.")
done(err, null, err.message)
})
})
.catch(err => {
console.log(err)
res.status(500).send({
message: "An error has occured while retrieving data."
})
})
}
}

用户关系 :

enter image description here

最佳答案

I tried making a User data without making a UserScore first.



您在 UserUserScore 之间定义的外键约束
永远不会允许您在 UserScoreId 表中添加 User 表中不存在的 UserScore,因为这会违反
SQL 外键约束。这确实是一个约束!

据我了解(如果我错了,请纠正我),
您正在模拟用户可能有一个或多个分数的事实,
如果是这样,那么 userId 应该在 UserScore 表中。

这样,如果具有相同电子邮件的用户不存在,您可以先添加用户,然后添加用户分数。

所以你必须改变你定义 sequelize 关联的方式
并将 userId 设置为 UserScore 表上的外键。

以下是定义关联的方法
//will add userId to UserScore table 
User.hasMany(UserScore, {
foreignKey: { name: "userId", allowNull: false, defaultValue: 1 },
as: "score",
targetKey: "id"
})

//same here, will add userId to UserScore table
UserScore.belongsTo(User, {
foreignKey: "userId",
sourceKey: "id"
})

关于javascript - Sequelize 如何正确创建具有约束的用户数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61877943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com