簡體   English   中英

將 ENUM 與 Sequelize 和 Typescript 一起使用

[英]Use ENUM with Sequelize and Typescript

我正在嘗試使用 USER class 創建一個 API,它可以有不止一種使用 API 進行身份驗證的方法。

我設法讓它與只有 1 個憑據的 1 個用戶一起工作,但是當嘗試擴展以允許多個憑據時,我收到錯誤: UnhandledPromiseRejectionWarning: SequelizeDatabaseError: (conn=498, no: 1265, SQLState: 01000) Data truncated for column 'type' at row 1

我目前擁有的是這樣的:

User.hasMany(Credential, { foreignKey: 'id', sourceKey: 'id' });

和這個:

//Credential.ts
export function CredentialInit(sequelize: Sequelize) {
    let cred = Object.keys(CredentialType);
    let credArr: string[] = [];
    for(let i = 0; i < cred.length/2; i++) {
        credArr.push(`${i}`);
    };
    Credential.init({
        email: {
            type: DataTypes.STRING,
            allowNull: true
        },
        password: {
            type: DataTypes.STRING,
            allowNull: true
        },
        token: {
            type: DataTypes.STRING,
            allowNull: true
        },
        type: {
            type: DataTypes.ENUM,
            values: credArr,
            allowNull: false
        }
    }, {
        sequelize: sequelize,
        tableName: 'credentials'
    });
}

export enum CredentialType {
    EMAIL,
    TOKEN
}

export class Credential extends BaseModel {
    public type!: CredentialType;
    public token?: string;
    public email?: string;
    public password?: string;
}

還有這個 Model 從我所有的其他模型中刪除這些東西。

//BaseModel.ts
export class BaseModel extends Model {
    public id?: number;
    public readonly createdAt?: Date;
    public readonly updatedAt?: Date;
}

知道為什么我會收到此消息嗎? 我這樣寫是因為我不想兩次聲明枚舉的內容..如果改變了我希望它在任何地方都改變....

好吧,經過更多的實驗,我找到了一種方法。 由於枚舉選項在 typescript/javascript 中表示為數字,因此我更改了與枚舉對應的數據庫類型:

Credential.init({
    email: {
        type: DataTypes.STRING,
        allowNull: true
    },
    password: {
        type: DataTypes.STRING,
        allowNull: true
    },
    token: {
        type: DataTypes.STRING,
        allowNull: true
    },
    type: {
        type: DataTypes.INTEGER,
        allowNull: false
    }
}, {
    sequelize: sequelize,
    tableName: 'credentials'
});

當它作為整數保存到數據庫時,錯誤就消失了。

由於 TypeScript 中的enum是一個值,因此您可以將enum值傳播到 Sequelize 的DataTypes.ENUM中,如下所示:

enum CredentialType {
  EMAIL,
  TOKEN
}

Credential.init({
  // ...
  type: {
    type: DataTypes.ENUM(...Object.values(CredentialType)),
    allowNull: false
  }
}, {
  sequelize: sequelize,
  tableName: 'credentials'
});

或者使用sequelize-typescript庫,如下所示:

import { Column, DataType, Model, Table } from "sequelize-typescript";

enum CredentialType {
  EMAIL = "EMAIL",
  TOKEN = "TOKEN",
}

@Table
class Credential extends Model {
  @Column({
    defaultValue: CredentialType.EMAIL,
    type: DataType.ENUM(...Object.values(CredentialType)),
  })
  type!: CredentialType;
}

請注意,TypeScript 中enum的默認值已編入索引,但可以用您自己的值覆蓋,如下所示:

enum CredentialType {
  EMAIL = "EMAIL",
  TOKEN = "TOKEN"
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM