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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 06:17:04