【问题标题】:Argument of type 'Class' is not assignable to parameter of type 'AggregateRoot<IEvent>'\'Class\' 类型的参数不可分配给 \'AggregateRoot<IEvent>\' 类型的参数
【发布时间】:2023-01-09 03:25:00
【问题描述】:

我的CommandHandler 有问题。我收到无法解决的错误。你知道是什么原因造成的吗?

“用户”类型的参数不可分配给类型的参数 '聚合根'。类型“用户”缺少以下内容 “AggregateRoot”类型的属性: [IS_AUTO_COMMIT_ENABLED]、[内部事件]ts(2345)

// user.repository.ts
...

@Injectable()
export class UserRepository extends Repository<User> {
    constructor(private dataSource: DataSource) {
        super(User, dataSource.createEntityManager());
    }

    async createUser(userRegisterDto: UserRegisterDto) {
        const id = uuidv4();
        const user = await this.save(
            super.create({ ...{ id }, ...userRegisterDto }),
        );
        user.create();
        return user;
    }

    async updateUser(userDto: UserDto) {
        const updatedUser = await super.findOne({
            where: { id: userDto.id },
        });

        updatedUser.update();

        return updatedUser;
    }

    async deleteUser(userDto: UserDto) {
        const deletedUser = await super.findOne({
            where: { id: userDto.id },
        });

        deletedUser.delete();

        return await super.delete(userDto.id);
    }
}

// create-user.handler.ts
...

@CommandHandler(CreateUserCommand)
export class CreateUserHandler implements ICommandHandler<CreateUserCommand> {
    constructor(
        private readonly _repository: UserRepository,
        private readonly _publisher: EventPublisher,
    ) {}

    async execute(command: CreateUserCommand): Promise<void> {
        Logger.log('Async CreateUserHandler...', 'CreateUserCommand');

        await this._repository
            .findOne({ where: { email: command.userRegisterDto.email } })
            .then((user) => {
                if (user) {
                    throw new HttpException(
                        'User with this email already exists',
                        HttpStatus.CONFLICT,
                    );
                }
            });

        const { userRegisterDto } = command;
        const user = this._publisher.mergeObjectContext(
            await this._repository.createUser(userRegisterDto),
        );

        user.commit();
    }
}

我的用户扩展了一个 AbstractEntity。在 AbstractEntity 中,我扩展了 AggregateRoot:

// abstract.entity.ts
'use strict';
import { AggregateRoot } from '@nestjs/cqrs';
import { IAggregateEvent } from 'nestjs-eventstore';
import {
    CreateDateColumn,
    PrimaryGeneratedColumn,
    UpdateDateColumn,
} from 'typeorm';

export abstract class AbstractEntity extends AggregateRoot<IAggregateEvent> {
    @PrimaryGeneratedColumn('uuid')
    id!: string;

    @CreateDateColumn({ type: 'timestamp', name: 'created_at' })
    createdAt: Date;

    @UpdateDateColumn({ type: 'timestamp', name: 'updated_at' })
    updatedAt: Date;

    abstract toDto();
}

【问题讨论】:

    标签: typescript nestjs


    【解决方案1】:

    您的User 模型似乎没有扩展AggregateRoot。检查the documentation,其中的示例是:

    export class Hero extends AggregateRoot {
      constructor(private id: string) {
        super();
      }
    

    遗漏的两个值(IS_AUTO_COMMIT_ENABLED INTERNAL_EVENTS)在AggregateRoot 类中。检查implementation。所以扩展应该有这些值。

    【讨论】:

    • 谢谢您的回答。我也一直在想。但是不,我尝试了一切,但没有成功。我已经更新了我的主题。我添加了一段代码。
    猜你喜欢
    • 1970-01-01
    • 2019-06-24
    • 2021-06-14
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2020-03-20
    相关资源
    最近更新 更多