node.js - Sequelize-typescript 'HasManyCreateAssociationMixin' 不是函数

标签 node.js typescript sequelize.js

我在 sequelize-typescript 中有一个模型,Door.ts:

import { Table, Model, Column, AutoIncrement, PrimaryKey, ForeignKey, DataType, AllowNull, BelongsTo, HasMany } from 'sequelize-typescript';
import { Location } from '@modules/location';
import { AkilesServiceV1, AkilesServiceV0, IDoorService } from '@services/DoorService';
import { BelongsToGetAssociationMixin } from 'sequelize/types';
import { DoorLog } from '@modules/door_log';
import { HasManyCreateAssociationMixin } from 'sequelize';

@Table({ tableName: 'door' })
class Door extends Model<Door> {
    @PrimaryKey
    @AutoIncrement
    @Column
    id!: number;

    @AllowNull(false)
    @Column
    type!: string;

    @Column
    button_id!: string;

    @Column
    gadget_id!: string;

    @Column
    action_id!: string;

    @AllowNull(false)
    @Column(DataType.ENUM('vehicular','pedestrian'))
    access_type!: 'vehicular' | 'pedestrian';

    @AllowNull(false)
    @Column
    description_tag!: string;

    @Column(DataType.VIRTUAL)
    description!: string;

    @ForeignKey(() => Location)
    @AllowNull(false)
    @Column
    location_id!: number;

    @BelongsTo(() => Location)
    location!: Location;

    @HasMany(() => DoorLog)
    door_logs!: DoorLog[];

    public getLocation!: BelongsToGetAssociationMixin<Location>;
    public createDoorLog!: HasManyCreateAssociationMixin<DoorLog>;

    public async open () {
        let doorService: IDoorService;
        switch(this.type) {
            case 'akiles-v0':
                doorService = new AkilesServiceV0();
                break;
            case 'akiles-v1':
                doorService = new AkilesServiceV1();
                break;
            default:
                doorService = new AkilesServiceV1();
                break;
        }

        //await doorService.open(this);

        return await this.createDoorLog({ door_id: this.id, timestamp: new Date() });

    }

    public async getParking() {
        const location: Location = await this.getLocation();
        return await location.getParking();
    }
}

export default Door

正如你所看到的,它有两个与 Mixin 相关的函数:
public getLocation!: BelongsToGetAssociationMixin<Location>;
public createDoorLog!: HasManyCreateAssociationMixin<DoorLog>;

第一个完美地使用它,如下所示: await this.getLocation() 。但是,当我这样称呼它时,第二个:await this.createDoorlog ({door_id: this.id, timestamp: new Date ()}) 返回以下错误:
TypeError: this.createDoorLog is not a function

我也试过不带参数调用函数,但得到了相同的结果。我不明白为什么这两个函数虽然创建几乎相同,但行为却不同。我错过了 HasManyCreateAssociationMixin 的东西吗?

谢谢你。

最佳答案

因为当我不可避免地再次遇到这个问题时,又被同样的问题所困扰。答案是将“as”添加到 @HasMany mixin。 Sequelize 似乎有驼峰类的问题。
所以在这种情况下添加

@HasMany(() => DoorLog, options: {as: "doorLog" })
    door_logs!: DoorLog[];
或者沿着这些路线的东西应该允许你使用这个mixin

关于node.js - Sequelize-typescript 'HasManyCreateAssociationMixin' 不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58273415/

相关文章:

typescript - 如何设计一个在构建后配置的 vue-cli 应用程序?

typescript - Intellij 找不到 tsconfig.json

javascript - 设置对象名称?

node.js - 在 Azure 函数(Nodejs)中使用 Jest 进行测试时 process.env 变量未定义

typescript - TSLint : variable name must be in camelcase or uppercase

mysql - 使用 findAll 函数将选择日期序列化到列之间

node.js - 间接关联的 Sequelize

transactions - Node.js 7 如何将sequelize事务与async/await一起使用?

RFC3986 之前的 URL 的 Node.js URL 编码(使用 + 与 %20)

javascript - 从 Node 中的json文件中删除