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

执行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();

验证步骤

  1. 执行npm run build重新编译代码
  2. 运行编译后的代码(通常为node dist/index.js)
  3. 查看控制台输出,确认DB connection successful.和User created successfully.正常打印,错误消失

内容的提问来源于stack exchange,提问作者neo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:52:16