Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sequelize-typescript 'HasManyCreateAssociationMixin' is not a function

I have a model in 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

As you can see it has these two functions associated with Mixins:

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

The first works perfectly using it like this: await this.getLocation(). However, the second when I call it like this: await this.createDoorlog ({door_id: this.id, timestamp: new Date ()}) returns the following error:

TypeError: this.createDoorLog is not a function

I've also tried calling the function without parameters but got the same result. I don't understand why the two functions, while created almost identically, behave differently. Am I missing something with HasManyCreateAssociationMixin?

Thank you.

like image 352
Josel567 Avatar asked Sep 07 '26 05:09

Josel567


1 Answers

For when I inevitably come across this question again perplexed by the same problem. The answer Is to ad "as" to the @HasMany mixin. Sequelize appears to have issues with camelcase classes.

So in this case adding

@HasMany(() => DoorLog, options: {as: "doorLog" })
    door_logs!: DoorLog[];

or something along these lines should allow you to use this mixin

like image 116
Richard Price Avatar answered Sep 10 '26 23:09

Richard Price