开发者问题收集

为什么我的多对多关系字段未定义?

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