[英]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.