Sequelize调用findAll/create报错:函数不存在或无法读取属性
Sequelize模型调用错误问题排查与解决
我是Sequelize新手,查询模型调用API时出现findAll is not a function错误,用POST调用create()也碰到同类问题。改了模型导入导出方式没解决;修改模型文件后,又出现Cannot read properties of undefined (reading 'findAll')错误。
相关代码文件
route.ts文件
import { create_brands, fetch_brands } from "../../../service/dbService"; export const POST = async (req: Request, res: Response) => { try { const created_brands = await create_brands(req.body); return new Response(JSON.stringify(created_brands)); } catch (err) { return new Response(`Error posting data: ${err.message}`, { status: 500, }); } }; export const GET = async (req: Request, res: Response) => { try { const all_brands = await fetch_brands(); return new Response(JSON.stringify(all_brands)); } catch (err) { return new Response(`Error fetching data: ${err.message}`, { status: 500, }); } };
dbService.js文件
import { brands } from "../database/models"; console.log(JSON.stringify(brands)); export async function create_brands({ name }) { const createdBrand = await brands.create({ name: name, }); return createdBrand.dataValues; } export async function fetch_brands() { const allBrands = await brands.findAll(); return allBrands; }
初始models/brand.js文件
const { Model, DataTypes } = require("sequelize"); import connection from "../connection"; class brands extends Model { static associate(models) { brands.hasMany(models.products, { sourceKey: "id", foreignKey: "brandId", as: "products", }); } } brands.init( { id: { allowNull: false, primaryKey: true, type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, }, name: DataTypes.STRING, }, { sequelize: connection, modelName: "brands", timestamps: true, underscored: true, } ); export default brands;
models/index.js文件
const sequelize = require("../connection"); const brands = require("./brands"); const products = require("./products"); export { sequelize, brands, products };
connection.js文件
const { Sequelize } = require("sequelize"); const sequelize = new Sequelize({ dialect: "mysql", dialectModule: require("mysql2"), host: process.env.DB_HOST, username: process.env.DB_USER, password: process.env.DB_PASS, database: process.env.DB_NAME, }); async function testConnection() { try { await sequelize.authenticate(); console.log("Connection has been established successfully."); } catch (error) { console.error("Unable to connect to the database:", error); } } testConnection(); module.exports = sequelize;
修改后的brands.js文件
const { Model } = require("sequelize"); module.exports = (sequelize, DataTypes) => { class brands extends Model { static associate(models) { this.hasMany(models.products); } } brands.init( { id: { allowNull: false, primaryKey: true, type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, }, name: DataTypes.STRING, }, { sequelize: connection, modelName: "brands", timestamps: true, underscored: true, } ); return brands; };
修改后的products.js文件
const { Model } = require("sequelize"); module.exports = (sequelize, DataTypes) => { class products extends Model { static associate(models) { this.belongsTo(models.brands); } } products.init( { id: { allowNull: false, primaryKey: true, type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, }, name: { type: DataTypes.STRING, }, images: { type: DataTypes.STRING, }, brandId: { type: DataTypes.UUID, field: "brand_id", references: { model: brands, key: "id", }, }, }, { sequelize: connection, modelName: "products", timestamps: true, underscored: true, } ); return products; };
问题根源与解决步骤
1. 核心问题:模型未正确初始化
修改后的模型改成了工厂函数(接收sequelize和DataTypes的函数),但models/index.js直接导出了未执行的工厂函数,导致brands是函数而非Sequelize模型实例,自然调用不了findAll/create方法;后续又因引用未定义变量导致模型变成undefined。
2. 修正models/index.js的模型初始化逻辑
const sequelize = require("../connection"); const DataTypes = require("sequelize").DataTypes; // 导入模型工厂函数 const brandsFactory = require("./brands"); const productsFactory = require("./products"); // 执行工厂函数,生成模型实例 const brands = brandsFactory(sequelize, DataTypes); const products = productsFactory(sequelize, DataTypes); // 建立模型关联 brands.associate({ products }); products.associate({ brands }); module.exports = { sequelize, brands, products };
3. 修复模型文件中的变量引用错误
修改后的模型里误用了未定义的connection,要替换成传入的sequelize参数:
修正后的brands.js
const { Model } = require("sequelize"); module.exports = (sequelize, DataTypes) => { class brands extends Model { static associate(models) { this.hasMany(models.products, { sourceKey: "id", foreignKey: "brandId", as: "products", }); } } brands.init( { id: { allowNull: false, primaryKey: true, type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, }, name: DataTypes.STRING, }, { sequelize: sequelize, modelName: "brands", timestamps: true, underscored: true, } ); return brands; };
修正后的products.js
const { Model } = require("sequelize"); module.exports = (sequelize, DataTypes) => { class products extends Model { static associate(models) { this.belongsTo(models.brands, { foreignKey: "brandId", targetKey: "id", }); } } products.init( { id: { allowNull: false, primaryKey: true, type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, }, name: { type: DataTypes.STRING, }, images: { type: DataTypes.STRING, }, brandId: { type: DataTypes.UUID, field: "brand_id", references: { model: "brands", key: "id", }, }, }, { sequelize: sequelize, modelName: "products", timestamps: true, underscored: true, } ); return products; };
4. 统一模块规范
项目中混用了ES模块(import/export)和CommonJS(require/module.exports),建议统一规范:
- 如果用Node.js环境,在
package.json中添加"type": "module",全量改用ES模块语法; - 或者将
dbService.js改为CommonJS:
const { brands } = require("../database/models"); console.log(JSON.stringify(brands)); async function create_brands({ name }) { const createdBrand = await brands.create({ name: name, }); return createdBrand.dataValues; } async function fetch_brands() { const allBrands = await brands.findAll(); return allBrands; } module.exports = { create_brands, fetch_brands };
5. 验证结果
启动项目后,查看dbService.js中打印的brands,如果输出包含findAll、create等方法,说明模型初始化成功,API调用即可正常工作。
内容的提问来源于stack exchange,提问作者Lavalse67
相关产品推荐
相关产品推荐

