使用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-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
相关产品推荐
相关产品推荐

