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

使用sequelize-auto生成的模型无法查询数据库,报错TypeError

问题:使用sequelize-auto生成的模型查询数据库时触发TypeError

错误信息

TypeError: Cannot convert undefined or null to object
at Function.keys ()
at Function.findAll (/home/jefry/node/sequelize/node_modules/sequelize/src/model.js:1755:47)
at /home/jefry/node/sequelize/src/components/users/controllers.ts:11:32
at Generator.next ()
at /home/jefry/node/sequelize/src/components/users/controllers.ts:31:71
at new Promise ()
at __awaiter (/home/jefry/node/sequelize/src/components/users/controllers.ts:27:12)
at list (/home/jefry/node/sequelize/src/components/users/controllers.ts:45:12)
at Layer.handle [as handle_request] (/home/jefry/node/sequelize/node_modules/express/lib/router/layer.js:95:5)
at next (/home/jefry/node/sequelize/node_modules/express/lib/router/route.js:144:13)

控制器代码

export async function list(req: Request, res: Response) {
  try {
    const list = await primera.findAll();
    res.json({ list });
  } catch (error) {
    console.log(error);
  }
}

模型代码(primera.ts)

import * as Sequelize from 'sequelize';
import { DataTypes, Model, Optional } from 'sequelize';

export interface primeraAttributes {
  verdad?: number;
}

export type primeraOptionalAttributes = "verdad";
export type primeraCreationAttributes = Optional<primeraAttributes, primeraOptionalAttributes>;

export class primera extends Model<primeraAttributes, primeraCreationAttributes> implements primeraAttributes {
  verdad?: number;

  static initModel(sequelize: Sequelize.Sequelize): typeof primera {
    return primera.init({
      verdad: {
        type: DataTypes.BOOLEAN,
        allowNull: true
      }
    }, {
      sequelize,
      tableName: 'primera',
      timestamps: false
    });
  }
}

init-models.ts代码

import type { Sequelize } from "sequelize";
import { primera as _primera } from "./primera";
import type { primeraAttributes, primeraCreationAttributes } from "./primera";

export {
  _primera as primera,
};

export type {
  primeraAttributes,
  primeraCreationAttributes,
};

export function initModels(sequelize: Sequelize) {
  const primera = _primera.initModel(sequelize);

  return {
    primera: primera,
  };
}

解决方案

这个错误的核心原因是直接使用了未初始化的模型类。sequelize-auto生成的模型必须先通过initModels方法传入Sequelize实例完成初始化,才能执行查询等数据库操作。

具体修复步骤:

  1. 创建Sequelize实例(如果还没创建):
import { Sequelize } from 'sequelize';

// 根据你的数据库配置修改参数
const sequelize = new Sequelize('your_db_name', 'your_username', 'your_password', {
  host: 'localhost',
  dialect: 'mysql' // 替换为你的数据库类型,比如postgres、sqlite等
});
  1. 初始化模型并获取可用实例:
import { initModels } from './path/to/init-models'; // 替换为实际文件路径

// 传入Sequelize实例初始化所有模型
const models = initModels(sequelize);
  1. 在控制器中使用初始化后的模型:
    修改控制器代码,用models.primera替代直接引用的primera类:
export async function list(req: Request, res: Response) {
  try {
    const list = await models.primera.findAll();
    res.json({ list });
  } catch (error) {
    console.log(error);
  }
}

额外检查点

  • 确保initModels函数正确调用了模型的initModel方法,并传入了有效的Sequelize实例。
  • 验证数据库连接是否正常,可以通过sequelize.authenticate()测试连接:
async function testConnection() {
  try {
    await sequelize.authenticate();
    console.log('数据库连接成功');
  } catch (error) {
    console.error('数据库连接失败:', error);
  }
}
testConnection();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:35:21