执行npm run build后触发TypeError: Cannot read properties of undefined (reading 'create')
解决
TypeError: Cannot read properties of undefined (reading 'create')问题 核心原因分析
该错误是因为db.User未被正确加载,调用create方法时触发undefined错误,主要诱因包括:
- 模型加载的文件后缀过滤逻辑错误,编译后无法识别
.js格式的模型文件 - CommonJS与ES模块混合使用,导致模块加载异常
- 数据库初始化与模型操作的时序不匹配
具体解决方案
1. 修复模型文件过滤逻辑
修改models/index.ts中的文件过滤条件,同时支持.ts和.js后缀,确保编译前后都能正确加载模型:
.filter((file: string) => { return ( file.indexOf('.') !== 0 && file !== basename && (file.slice(-3) === '.ts' || file.slice(-3) === '.js') && // 新增对.js文件的支持 file.indexOf('.test.js') === -1 ); })
2. 统一模块导出风格
将models/user.ts的导出方式改为ES模块,与models/index.ts保持一致:
import { Model, UUIDV4 } from 'sequelize'; interface UserAttributes { id: string; // 注意:id类型应为UUID对应的string,原number类型错误 first_name: string; last_name: string; } export default (sequelize: any, DataTypes: any) => { class User extends Model<UserAttributes> implements UserAttributes { id!: string; first_name!: string; last_name!: string; static associate(models: any) { // 定义关联逻辑(如有需要) } } User.init({ id: { type: DataTypes.UUID, defaultValue: UUIDV4, allowNull: false, primaryKey: true }, first_name: DataTypes.STRING, last_name: DataTypes.STRING }, { sequelize, modelName: 'User', }); return User; };
同时修改models/index.ts中加载模型的代码,适配ES模块导入:
// 替换原forEach中的require逻辑 .forEach(async (file: any) => { const modelModule = await import(path.join(__dirname, file)); const model = modelModule.default(sequelize, Sequelize.DataTypes); db[model.name] = model; });
注意:此修改后需将models/index.ts的初始化逻辑改为异步,或封装成异步函数导出。
3. 调整数据库操作时序
确保数据库同步完成后再执行模型操作,避免时序问题:
修改index.ts中的代码:
import express, { Application } from 'express'; import db from './models'; const app: Application = express(); const calc = (a: number, b: number) => a + b; // 封装启动逻辑为异步函数 async function startServer() { try { await db.sequelize.sync(); console.log('DB connection successful.'); // 同步完成后再创建用户 await db.User.create({ first_name: "lola", last_name: "lola" }); console.log('User created successfully.'); } catch (err) { console.error('Error occurred:', err); } app.listen(5000, () => console.log('Server is running')); } startServer();
验证步骤
- 执行
npm run build重新编译代码 - 运行编译后的代码(通常为
node dist/index.js) - 查看控制台输出,确认
DB connection successful.和User created successfully.正常打印,错误消失
内容的提问来源于stack exchange,提问作者neo
相关产品推荐
相关产品推荐

