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

Next.js+Sequelize控制器无法正确导入模型获取数据求助

问题根源

你当前的核心问题是直接导入了模型的工厂函数,而非Sequelize初始化后的模型实例。你的recette.js导出的是一个接收sequelize和DataTypes参数的函数,必须通过Sequelize实例初始化后,才能得到可调用方法的模型对象。


解决方案

步骤1:创建模型统一入口文件

在models目录下新建index.js,用于初始化Sequelize实例并加载所有模型(这是Sequelize的标准用法):

const { Sequelize } = require('sequelize');
const fs = require('fs');
const path = require('path');

// 配置PostgreSQL连接(建议用环境变量存储敏感信息)
const sequelize = new Sequelize(
  process.env.DB_NAME,
  process.env.DB_USER,
  process.env.DB_PASSWORD,
  {
    host: process.env.DB_HOST,
    dialect: 'postgres',
    logging: console.log, // 可选:开启日志方便调试
  }
);

const db = {};

// 自动加载目录下所有模型文件
fs.readdirSync(__dirname)
  .filter(file => file !== 'index.js' && file.endsWith('.js'))
  .forEach(file => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
    db[model.name] = model;
  });

// 执行模型关联逻辑
Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

步骤2:修改控制器的模型导入

将recetteController.js中的导入语句替换为从统一入口获取初始化好的模型:

// 替换原有导入语句
const { Recette } = require('../../models/index');

console.log(Recette); // 现在会输出Sequelize模型实例,而非undefined或函数

export default async function handler(req, res) {
    try {
        const recettes = await Recette.getAllRecette(); 
        res.status(200).json(recettes);
    } catch (error) {
        console.error(error); // 打印具体错误,便于调试
        res.status(500).json({ error: 'Erreur lors de la récupération des recettes' });
    }
}

额外调试建议
  • 确保环境变量配置了正确的PostgreSQL连接信息(数据库名、用户名、密码、主机)
  • 执行迁移命令确认数据库表已创建:npx sequelize-cli db:migrate
  • 可先在控制器中直接调用Recette.findAll()测试,验证模型可用后再使用自定义的getAllRecette方法
  • 检查模型文件名与导入路径是否完全匹配(比如是否为recette.js)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:44:58