使用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实例完成初始化,才能执行查询等数据库操作。
具体修复步骤:
- 创建Sequelize实例(如果还没创建):
import { Sequelize } from 'sequelize'; // 根据你的数据库配置修改参数 const sequelize = new Sequelize('your_db_name', 'your_username', 'your_password', { host: 'localhost', dialect: 'mysql' // 替换为你的数据库类型,比如postgres、sqlite等 });
- 初始化模型并获取可用实例:
import { initModels } from './path/to/init-models'; // 替换为实际文件路径 // 传入Sequelize实例初始化所有模型 const models = initModels(sequelize);
- 在控制器中使用初始化后的模型:
修改控制器代码,用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
相关产品推荐
相关产品推荐

