You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用sequelize-typescript定义模型,启动Express API时触发TypeError

问题:sequelize-typescript模型定义启动时报TypeError: Cannot convert undefined or null to object

我在Express API中使用sequelize-typescript定义TypeScript模型(当前仅这一个模型),启动服务器时触发TypeError: Cannot convert undefined or null to object,错误出现在模型第一个字段对应的编译后代码中。

模型代码(省略部分同类字段):

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

@Table({
    timestamps: false,    
    tableName:"BranchNew",
    freezeTableName: true,
    modelName:"BranchNew",
    schema: 'hr',
})
export class Branch extends Model {
    @Column({
        type: DataType.INTEGER,
        allowNull: true,
    })
    ContractorCode!: number;
    @Column({
        type: DataType.INTEGER,
        autoIncrement: false,
        allowNull: false,
        primaryKey: true,
    })
    BranchNumber!: number;
    @Column({
        type: DataType.STRING,
        allowNull: false,
    })
    BranchName!: string;
    @Column({
        type: DataType.DATE,
        allowNull: true,
    })
    DateAcquired!: Date;
    @Column({
        type: DataType.STRING,
        allowNull: true,
    })
    Telephone!: string;
    // ... 其他字段
}

错误代码片段(编译后dist文件夹中):

__esDecorate(null, null, _ContractorCode_decorators, 
{ kind: "field", name: "ContractorCode", static: false, private: false, 
access: { has: obj => "ContractorCode" in obj, 
get: obj => obj.ContractorCode, 
set: (obj, value) => { obj.ContractorCode = value; } } }, 
_ContractorCode_initializers, _instanceExtraInitializers);

所有字段的编译代码开头都是(null, null,...),我认为模型定义符合文档规范,但仍出现该错误。


解决方法:

  • 修正TypeScript配置
    打开tsconfig.json,确保启用装饰器相关配置,调整后如下:

    {
      "compilerOptions": {
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true,
        "target": "ES2020",
        "module": "CommonJS"
      }
    }
    
  • 核对依赖版本兼容性
    执行npm ls sequelize sequelize-typescript typescript查看版本,确保三者版本匹配:

    • sequelize-typescript v2.x 需搭配 sequelize v6.x + typescript v4.5+
      版本不匹配时,升级或降级对应包即可。
  • 正确注册模型
    初始化Sequelize实例时必须显式注册模型,示例代码:

    import { Sequelize } from 'sequelize-typescript';
    import { Branch } from './models/Branch';
    
    const sequelize = new Sequelize({
      dialect: 'mysql', // 替换为你的数据库类型
      host: 'localhost',
      database: 'your_db',
      username: 'your_user',
      password: 'your_pwd',
      models: [Branch], // 注册模型
    });
    
  • 对齐字段配置与TS类型
    对于allowNull: true的字段,把非空断言!改为可选符号?,避免运行时冲突:

    @Column({
        type: DataType.INTEGER,
        allowNull: true,
    })
    ContractorCode?: number;
    
  • 清理编译产物重新构建
    删除dist文件夹,重新执行tsc或npm run build,避免旧编译文件干扰。


内容的提问来源于stack exchange,提问作者Colin-G-Davidson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:27:41