模型字段类型

    在 define 函数的声明里面,需要传入的字段配置项其实是 DefineAttributes 类型。

    1. [name: string]: string | DataTypeAbstract | DefineAttributeColumnOptions;

    定义如上,这表示这对象里面的 key 必须是一个 string,而 value 则是 string 、DataTypeAbstract 、DefineAttributeColumnOptions 三者其一即可。

    1.DataTypeAbstract

    而我们的 DataTypes 的定义是这样的,也就是我们所有支持的类型,但是数据库之间是存在差异的,像 MYSQL 就不支持 JSON 类、Array 类等。

    1. interface DataTypes {
    2. ABSTRACT: DataTypeAbstract;
    3. STRING: DataTypeString;
    4. CHAR: DataTypeChar;
    5. TEXT: DataTypeText;
    6. NUMBER: DataTypeNumber;
    7. INTEGER: DataTypeInteger;
    8. BIGINT: DataTypeBigInt;
    9. FLOAT: DataTypeFloat;
    10. TIME: DataTypeTime;
    11. DATE: DataTypeDate;
    12. DATEONLY: DataTypeDateOnly;
    13. BOOLEAN: DataTypeBoolean;
    14. NOW: DataTypeNow;
    15. BLOB: DataTypeBlob;
    16. DECIMAL: DataTypeDecimal;
    17. NUMERIC: DataTypeDecimal;
    18. UUID: DataTypeUUID;
    19. UUIDV1: DataTypeUUIDv1;
    20. UUIDV4: DataTypeUUIDv4;
    21. HSTORE: DataTypeHStore;
    22. JSON: DataTypeJSONType;
    23. JSONB: DataTypeJSONB;
    24. VIRTUAL: DataTypeVirtual;
    25. ARRAY: DataTypeArray;
    26. NONE: DataTypeVirtual;
    27. ENUM: DataTypeEnum;
    28. RANGE: DataTypeRange;
    29. REAL: DataTypeReal;
    30. DOUBLE: DataTypeDouble;
    31. "DOUBLE PRECISION": DataTypeDouble;
    32. GEOMETRY: DataTypeGeometry;
    33. }

    并且 interface SequelizeStatic extends SequelizeStaticAndInstance, DataTypes,也就是说 SequelizeStatic 是继承了 DataTypes 的,所以我么可以通过 Sequelize.INTEGER来访问 DataTypes 的一些变量。

    2.DefineAttributeColumnOptions

    1. interface DefineAttributeColumnOptions extends ColumnOptions {
    2. unique?: boolean | string | { name: string, msg: string };
    3. primaryKey?: boolean;
    4. autoIncrement?: boolean;
    5. comment?: string;
    6. references?: DefineAttributeColumnReferencesOptions;
    7. onUpdate?: string;
    8. onDelete?: string;
    9. get?: () => any;
    10. set?: (val: any) => void;
    11. validate?: DefineValidateOptions;
    12. values?: string[];
    13. }

    同时有这个validate这个选项,其实是支持验证的。也就是用了一个validator的库。它所支持的配置项如下。

    1. interface DefineValidateOptions {
    2. is?: string | Array<string | RegExp> | RegExp | { msg: string, args: string | Array<string | RegExp> | RegExp };
    3. not?: string | Array<string | RegExp> | RegExp | { msg: string, args: string | Array<string | RegExp> | RegExp };
    4. isEmail?: boolean | { msg: string };
    5. isUrl?: boolean | { msg: string };
    6. isIP?: boolean | { msg: string };
    7. isIPv4?: boolean | { msg: string };
    8. isIPv6?: boolean | { msg: string };
    9. isAlpha?: boolean | { msg: string };
    10. isAlphanumeric?: boolean | { msg: string };
    11. isNumeric?: boolean | { msg: string };
    12. isInt?: boolean | { msg: string };
    13. isFloat?: boolean | { msg: string };
    14. isDecimal?: boolean | { msg: string };
    15. isLowercase?: boolean | { msg: string };
    16. isUppercase?: boolean | { msg: string };
    17. notNull?: boolean | { msg: string };
    18. isNull?: boolean | { msg: string };
    19. notEmpty?: boolean | { msg: string };
    20. equals?: string | { msg: string };
    21. contains?: string | { msg: string };
    22. notIn?: string[][] | { msg: string, args: string[][] };
    23. isIn?: string[][] | { msg: string, args: string[][] };
    24. notContains?: string[] | string | { msg: string, args: string[] | string };
    25. isDate?: boolean | { msg: string, args: boolean };
    26. isAfter?: string | { msg: string, args: string };
    27. isBefore?: string | { msg: string, args: string };
    28. max?: number | { msg: string, args: number };
    29. min?: number | { msg: string, args: number };
    30. isArray?: boolean | { msg: string, args: boolean };
    31. isCreditCard?: boolean | { msg: string, args: boolean };
    32. [name: string]: any;
    33. }

    小荔枝

    // status: "inSale" | "noSale"; 注释掉这个的原因是为了避免ts 编译时报错,我们先给它一个 any 类型,来验证一下 validate 方法是否真正的起了验证作用。

    main 方法

    1. async function main() {
    2. try {
    3. // await Book.sync();
    4. // await User.sync();
    5. Book.beforeValidate(() => {
    6. console.log("验证之前");
    7. });
    8. const book = Book.build({ status: "onSale", author: "yugo", description: "lean ts", title: "typescript" });
    9. await book.validate()
    10. }catch(e){
    11. // console.log(e)
    12. if (e instanceof Sequelize.ValidationError) {
    13. console.log(e.message);
    14. }
    15. }
    16. process.exit(0)
    17. }

    运行可得到如下结果,说明验证错误是被 catch 捕获到了的,而且也打印了出来。

    1. # Yugo @ Tractor in ~/Desktop/nl-sequelize/code/chapter2 on git:master x [13:19:00]
    2. $ ts-node index.ts
    3. 验证之前
    4. Validation error: status field must be inSale or noSale
    1. # Yugo @ Tractor in ~/Desktop/nl-sequelize/code/chapter2 on git:master x [13:27:55]
    2. $ ts-node index.ts
    3. 验证之前

    小提示: 有的时候可能提示并没有告诉你可以调用哪些方法,大多数是因为代码编辑器的问题,直接去查看d.ts,自己找一下即可。