为什么我的多对多关系字段未定义?
2019-12-16
3896
我正在尝试创建一个关注者/关注系统,当我尝试将新用户附加到关注列表时,我收到错误
无法读取未定义的属性“推送”
。这最终会创建 2 个单独的表,一个用于关注其他用户的用户,一个用于被其他用户关注的用户。不确定为什么它没有选择该字段?任何帮助都值得感激。
import { Length } from "class-validator";
import {
Column,
CreateDateColumn,
Entity,
JoinTable,
ManyToMany,
OneToMany,
PrimaryColumn,
RelationCount,
Unique,
UpdateDateColumn
} from "typeorm";
export class User {
@PrimaryColumn()
public user_id: string;
@Column()
public first_name: string;
@Column()
public last_name: string;
@Column()
public email: string;
@Column()
public phone_number: string;
@Column()
public username: string;
@Column()
@CreateDateColumn()
public created_on: Date;
@Column()
@UpdateDateColumn()
public updated_at: Date;
@ManyToMany((type) => User, (user) => user.following)
@JoinTable()
public followers: User[];
@ManyToMany((type) => User, (user) => user.followers)
@JoinTable()
public following: User[];
@RelationCount((user: User) => user.followers)
public followers_count: number;
@RelationCount((user: User) => user.following)
public following_count: number;
}
const { user_id,
follow_user_id } = req.
const user_repo = getRepository(User);
const user = await user_repo.findOne({
where: {user_id}
});
const follow_user = new User();
follow_user.user_id = follow_user_id;
user.following.push(follow_user);
const result = user_repo.save(user);
错误指的是此行
user.following.push(follow_user);
UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'push' of undefined
3个回答
我在 OneToMany 和 ManyToOne 关系中遇到了类似的错误,其中相对返回 null/undefined。
我使用的解决方法是将其放在 User 类中:
@AfterLoad()
async nullChecks() {
if (!this.followers) {
this.followers = []
}
if (!this.following) {
this.following = []
}
}
Noah Anderson
2020-05-22
我没有测试以下方法,但我认为其中一种方法应该对您有所帮助。
第一种方法。
在您的
User
类中。
// Source code omission
@ManyToMany((type) => User, (user) => user.followers)
@JoinTable()
public following: User[] = []; // ★ Added assign
// Source code omission
第二种方法。
在您的
User
类中。
export class User {
// Source code omission
constructor() { // ★ Added line
this.following = []; // ★ Added line
} // ★ Added line
}
第三种方法。
在您使用
User
类的地方。
const follow_user = new User();
follow_user.user_id = follow_user_id;
user.following = []; // ★ Added line
user.following.push(follow_user);
const result = user_repo.save(user);
第四种方法。
在您使用
User
类的地方。
const follow_user = new User();
follow_user.user_id = follow_user_id;
user.following = [follow_user]; // ★ Edited line
const result = user_repo.save(user);
cxↄ
2019-12-16
我们使用这种方法来避免未定义的列表:
@ManyToMany((type) => User, (user) => user.following)
@JoinTable()
private _followers: User[];
...
get followers() : User[] {
if (!_followers) {
_followers = [];
}
return _followers;
}
Tom Baldwin
2021-10-21