TypeORM: невозможно прочитать свойство 'databaseName' из неопределенного при попытке упорядочить поле, созданное после loadRelationCountAndMap - PullRequest
1 голос
/ 30 мая 2019

Я пытаюсь посчитать количество просмотров постов, а затем упорядочить посты по количеству просмотров.

Это часть кода, в которой я пытаюсь сосчитать.Alias.views - это массив объектов.Как я понимаю, alias.viewsCount должен быть числом.

            qb.loadRelationCountAndMap('alias.commentsCount', 'alias.comments');
            qb.loadRelationCountAndMap('alias.votesCount', 'alias.voters');
            qb.loadRelationCountAndMap('alias.viewsCount', 'alias.views');
            qb.loadRelationCountAndMap('alias.sharesCount', 'alias.distributors');

            qb.orderBy('alias.viewsCount', 'DESC');

Но я постоянно получаю эту ошибку (журнал):

query: START TRANSACTION
query: SELECT "category"."id" AS "category_id", "category"."name" AS "category_name", "category"."slug" AS "category_slug" FROM "app_post_category" "category" INNER JOIN "app_post_category_post_type" "category_postTypes" ON "category_postTypes"."post_category_id"="category"."id" INNER JOIN "app_post_type" "postTypes" ON "postTypes"."id"="category_postTypes"."post_type_id" AND ("postTypes"."post_type" IN ($1, $2)) -- PARAMETERS: ["POST","ARTICLE"]
query: ROLLBACK
query: START TRANSACTION
[Nest] 923   - 05/30/2019, 4:47 PM   [ExceptionsHandler] Cannot read property 'databaseName' of undefined +21439ms
TypeError: Cannot read property 'databaseName' of undefined
    at /usr/src/app/src/query-builder/SelectQueryBuilder.ts:1866:145
    at Array.map (<anonymous>)
    at SelectQueryBuilder.createOrderByCombinedWithSelectExpression (/usr/src/app/src/query-builder/SelectQueryBuilder.ts:1861:14)
    at SelectQueryBuilder.<anonymous> (/usr/src/app/src/query-builder/SelectQueryBuilder.ts:1779:46)

    at step (/usr/src/app/node_modules/tslib/tslib.js:133:27)
    at Object.next (/usr/src/app/node_modules/tslib/tslib.js:114:57)
    at /usr/src/app/node_modules/tslib/tslib.js:107:75
    at new Promise (<anonymous>)
    at Object.__awaiter (/usr/src/app/node_modules/tslib/tslib.js:103:16)
    at SelectQueryBuilder.executeEntitiesAndRawResults (/usr/src/app/node_modules/typeorm/query-builder/SelectQueryBuilder.js:1313:24)

И да, ошибка появляется, когда я пытаюсьпорядок по любому из этих 4 полей в loadRelationCountAndMap

Вот PostEntity и вся моя функция получения сообщений:

export class PostEntity extends AbstractEntity {

    @Column({name: 'title', nullable: true})
    public title: string;

    @Column('text', {name: 'content', nullable: true})
    public content: string;

    @Column({name: 'video_url', nullable: true})
    public videoUrl: string;

    @Column('json', {name: 'media', nullable: true})
    public media: string[];

    @Column('enum', {enum: PostStatus, name: 'status', default: PostStatus.IN_REVIEW})
    public status: PostStatus;

    @Column('enum', {enum: PostType, name: 'type', default: PostType.POST})
    public type: PostType;

    @ManyToOne(() => User, object => object.posts, {nullable: false, onDelete: 'CASCADE'})
    @JoinColumn({name: 'author_id'})
    public author: User;

    @Column({name: 'author_id'})
    public authorId: number;

    @OneToMany(() => PostComment, object => object.post)
    public comments: PostComment[];

    @ManyToMany(() => User, object => object.votedPosts)
    public voters: User[];

    @ManyToMany(() => User, object => object.sharedPosts)
    public distributors: User[];

    @OneToMany(() => PostReport, postReport => postReport.post)
    public reports: PostReport[];

    @ManyToMany(() => TagEntity, object => object.posts, {cascade: ['insert', 'update']})
    @JoinTable({
        name: 'app_post_tags',
        joinColumn: {name: 'post_id', referencedColumnName: 'id'},
        inverseJoinColumn: {name: 'tag_id', referencedColumnName: 'id'}
    })
    public tags: TagEntity[];

    @ManyToOne(() => PostCategory, object => object.posts, {nullable: true, onDelete: 'SET NULL'})
    @JoinColumn({name: 'category_id'})
    public category: PostCategory;

    @ManyToOne(() => RewardTransfer, {nullable: true, onDelete: 'SET NULL'})
    @JoinColumn({name: 'reward_id'})
    public reward: RewardTransfer;

    @ManyToMany(() => User, {cascade: ['insert', 'update']})
    @JoinTable({
        name: 'app_post_mentions',
        joinColumn: {name: 'post_id', referencedColumnName: 'id'},
        inverseJoinColumn: {name: 'user_id', referencedColumnName: 'id'}
    })
    public mentions: User[];

    @OneToMany(() => Account, account => account.user)
    public accounts: Account[];

    @OneToMany(() => PostView, postView => postView.post)
    public views: PostView[];

    @OneToOne(() => PinnedPostEntity, object => object.post)
    public pinnedPost: PinnedPostEntity;

}

public async findMany(request: Request, userId?: number): Promise<FeedDto[]> {

        return getManager().transaction(async entityManager => {

            const filter: IPostFeedQuery = request.query;

            const qb = entityManager.createQueryBuilder(PostEntity, 'alias');

            qb.leftJoin('alias.author', 'author')
                .addSelect(['author.id', 'author.firstName', 'author.lastName', 'author.pictureUrl']);

            qb.where('alias.status IN (:...statuses)', {
                statuses: [PostStatus.PUBLISHED,
                    ...(filter.userId && userId && filter.userId === userId ? [PostStatus.IN_REVIEW] : [])]
            });

            qb.leftJoinAndSelect('alias.category', 'category');

            if (filter.userId) {
                qb.andWhere('author.id = :authorId', {authorId: filter.userId});
            }

            if (filter.category) {
                qb.andWhere('category.slug = :category', {category: filter.category});
            }

            if (filter.type) {
                qb.andWhere('alias.type = :type', {type: filter.type});
            } else {
                qb.andWhere('alias.type <> :ignoredType', {ignoredType: PostType.FORUM_TOPIC});
            }

            if (filter.tag) {
                qb.leftJoin('alias.tags', 'tags')
                    .andWhere('tags.slug = :tag', {tag: filter.tag});
            }

            qb.loadRelationCountAndMap('alias.commentsCount', 'alias.comments');
            qb.loadRelationCountAndMap('alias.votesCount', 'alias.voters');
            qb.loadRelationCountAndMap('alias.viewsCount', 'alias.views');
            qb.loadRelationCountAndMap('alias.sharesCount', 'alias.distributors');

            qb.orderBy('alias.viewsCount', 'DESC');

            if (userId) {
                qb.leftJoin(
                    'alias.voters',
                    'voters',
                    'voters.id = :userId', {userId}).addSelect(['voters.id']);
                qb.leftJoin(
                    'alias.reports',
                    'reports',
                    'reports.reporter = :userId', {userId}).addSelect(['reports.createdAt']);
                qb.leftJoin(
                    'alias.distributors',
                    'distributors',
                    'distributors.id = :userId', {userId}).addSelect(['distributors.id']);
            }

            const data = await this.apiService.setPagination<PostEntity>(request, qb);
            return data.map(value => new FeedDto(value));
        });
    }

Извините за слишком большой код, и спасибо залюбая помощь.

...