Dil*_*ena 5 javascript lazy-loading typescript typeorm
我有一个基本的用户表,其中他们可以熟练掌握各种乐器。我无法弄清楚创建基本updateUser
功能的正确方法,他们可以在其中更新用户信息,以及使用 Typeorm 和 MySQL 数据库的仪器熟练程度。
@Entity()
@ObjectType()
export class User extends BaseEntity {
public constructor(init?:Partial<User>) {
super();
Object.assign(this, init);
}
@Index({ unique: true})
@Column()
email: string;
@Index({ unique: true})
@Column()
username: string;
@Column()
@HideField()
password: string;
@Column({
nullable: true
})
profilePicture?: string;
@Index({ unique: true})
@Column()
phoneNumber: string;
//Lazy loading
@OneToMany(() => UserInstrument, p => p.user, {
cascade: true
})
instruments?: Promise<UserInstrument[]>;
}
Run Code Online (Sandbox Code Playgroud)
@Entity()
@ObjectType()
export class UserInstrument extends BaseEntity {
public constructor(init?:Partial<UserInstrument | InstrumentProficiencyInput>) {
super();
Object.assign(this, init);
}
@Column({
type: 'enum',
enum: Instrument
})
instrument : Instrument
@Column()
proficiency : number;
@JoinColumn()
@HideField()
userId : number;
@ManyToOne(() => User, p => p.instruments)
@HideField()
user : User;
}
Run Code Online (Sandbox Code Playgroud)
现在,使用预定义工具创建新用户不再是问题。我可以简单地插入一个新用户,它将自动填充相应表的Id
和字段。UserId
async create(request: RegisterUserInput) : Promise<boolean>{
const user = new User();
user.username = request.username;
user.password = request.password;
user.phoneNumber = request.phoneNumber;
user.email = request.email;
user.instruments = Promise.resolve(request.instruments?.map(p => new UserInstrument(p)));
const result = await this.usersRepository.save(user);
}
Run Code Online (Sandbox Code Playgroud)
现在,每当我执行类似于更新用户/仪器表的操作时,我都会遇到"ER_BAD_NULL_ERROR: Column 'userId' cannot be null"
异常
async updateUser(request: UpdateUserInput, id : number): Promise<boolean> {
var user = new User(classToPlain(request));
user.id = id;
user.instruments = Promise.resolve(request.instruments?.map(p => new UserInstrument(p)));
(await user.instruments)?.forEach(p => p.userId = id);
await this.usersRepository.save(user);
return true;
}
Run Code Online (Sandbox Code Playgroud)
此代码生成以下异常
code:'ER_BAD_NULL_ERROR'
errno:1048
index:0
message:'ER_BAD_NULL_ERROR: Column 'userId' cannot be null'
name:'QueryFailedError'
parameters:(2) [null, 8]
query:'UPDATE `user_instrument` SET `userId` = ? WHERE `id` = ?'
sql:'UPDATE `user_instrument` SET `userId` = NULL WHERE `id` = 8'
sqlMessage:'Column 'userId' cannot be null'
sqlState:'23000'
stack:'QueryFailedError: ER_BAD_NULL_ERROR: Column 'userId' cannot be null
Run Code Online (Sandbox Code Playgroud)
即使当我检查我的用户对象时,我可以看到该userId
字段设置正确
__has_instruments__:true
__instruments__:(1) [UserInstrument]
0:UserInstrument {created: '2020-11-29 02:46:10', instrument: 'Guitar', proficiency: 5, userId: 30}
length:1
Run Code Online (Sandbox Code Playgroud)
那么我做错了什么?是否有更优选的方法来更新用户仪器表,而无需直接访问仪器存储库?我不确定为什么save
我的创建方法的初始值有效,但更新方法无效。
归档时间: |
|
查看次数: |
1354 次 |
最近记录: |