我正在學習資料庫,試圖創建一個用戶和他的兩因素身份驗證代碼。一個User可以有多個TwoFa
所以,有2張桌子,User和TwoFa
用戶.ts
export interface IUser {
id: string;
email: string;
password: string;
twoFa: boolean; // Это флаг, включена ли двухфакторка
}
export interface IUserInstance
extends Model<IUser, Omit<IUser, "id" | "twoFa">>,
IUser,
IDateAt {}
export const User = sequelize.define<IUserInstance>(
"User",
{
id: {
type: DataTypes.UUID,
primaryKey: true,
defaultValue: DataTypes.UUIDV4,
},
email: {
type: DataTypes.STRING,
unique: true,
allowNull: false,
},
password: {
type: DataTypes.STRING,
allowNull: false,
},
twoFa: {
type: DataTypes.BOOLEAN,
defaultValue: false,
},
}
);
雙重脂肪
interface ITwoFa {
id: string;
ua: string;
}
export interface ITwoFaInstance
extends Model<ITwoFa, Omit<ITwoFa, "id">>,
ITwoFa {}
export const TwoFa = sequelize.define<ITwoFaInstance>(
"TwoFa",
{
id: {
type: DataTypes.UUID,
primaryKey: true,
defaultValue: DataTypes.UUIDV4,
},
ua: {
type: DataTypes.STRING,
allowNull: false,
}
}
);
也是一個帶有關聯的檔案
User.hasMany(TwoFa, {
as: "twoFaCodes",
onDelete: "CASCADE",
onUpdate: "CASCADE",
});
TwoFa.belongsTo(User);
await User.sync({ alter: isDev });
await TwoFa.sync({ alter: isDev });
下面是一個測驗腳本,用于創建User和TwoFa
const user = awaitUser.create({
login: "someLogin",
email: "[email protected]",
password: await argon2.hash("sfdsfs"),
});
const twoFaCode = await TwoFa.create(
{
ua: "dsfjdskfsd",
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
User: user // тут ругается тайпскрипт
},
{
include: [User],
},
);
В итоге получаю ошибку
ValidationErrorItem {
message: 'id must be unique',
type: 'unique violation',
path: 'id',
value: '14218bdb-5fef-4777-bdfd-094551d09ec5',
origin: 'DB',
instance: [User],
validatorKey: 'not_unique',
validatorName: null,
validatorArgs: []
}
其實我現在有兩個問題:
- 我在協會中做錯了什么?
- 如何創建正確的型別來創建 TwoFa 以便沒有打字稿錯誤并且關鍵不是用戶而是用戶
謝謝!
如果我添加關聯foreignKey: "userId",并在創建 TwoFa 時添加UPDuserId: user.id, ,那么一切都會正常作業。現在的問題是,為什么它不能與包含一起使用?
uj5u.com熱心網友回復:
您正在嘗試創建一個與具有相同主鍵值的新 TwoFa 實體關聯的用戶。
如果您指出這意味著您想要創建一個用戶以及一條記錄include,這不是您想要獲得的。
如果您只想創建一條記錄并將其與現有用戶相關聯,則只需指明不帶選項:createTwoFaTwoFaUserIdinclude
const twoFaCode = await TwoFa.create(
{
ua: "dsfjdskfsd",
UserId: user.id
}
);
默認情況下,ModelName Id如果您沒有foreginKey在關聯中明確指出選項,您將擁有一個外鍵欄位名稱為 (UserId)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/441238.html
