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

Sequelize CLI开发Next.js应用:findAll调用报错及模型导入异常求助

解决Next.js中Sequelize CLI生成模型无法导入的问题

问题根源

从调试输出和警告信息来看,核心问题有两个:

  1. Sequelize CLI自动生成的models/index.js使用了动态require表达式,Next.js的Webpack打包机制无法正确解析这种动态导入,导致Team等模型文件未被加载,最终导入的模型对象仅包含sequelize和Sequelize。
  2. Critical dependency: the request of a dependency is an expression警告正是Webpack对动态require无法解析的提示。

解决方案

方案1:替换动态require为静态导入(推荐)

修改models/index.js,把自动遍历文件的动态导入逻辑改成手动引入每个模型:

原自动生成的代码片段(问题代码):

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
    db[model.name] = model;
  });

替换为手动导入:

// 手动导入所有模型文件,确保文件名和模型名对应
const Team = require('./team')(sequelize, Sequelize.DataTypes);
db.Team = Team;

// 如有其他模型,按相同格式继续添加
// const User = require('./user')(sequelize, Sequelize.DataTypes);
// db.User = User;

修改后重新运行项目,调试Object.keys(modelsObj)即可看到Team模型,此时Team.findAll()可正常调用。

方案2:配置Next.js支持动态require(不推荐)

如果不想手动维护模型导入,可以修改next.config.js添加Webpack配置,兼容动态require:

/** @type {import('next').NextConfig} */
const nextConfig = {
  webpack: (config) => {
    // 忽略sequelize的外部依赖警告
    config.externals = [...config.externals, 'sequelize'];
    // 针对models/index.js启用动态导入解析
    config.module.rules.push({
      test: /models\/index\.js$/,
      use: [
        {
          loader: 'babel-loader',
          options: {
            plugins: ['dynamic-import-node'],
          },
        },
      ],
    });
    return config;
  },
};

module.exports = nextConfig;

此方式可能影响打包性能,且在Next.js App Router(RSC模式)下兼容性不如静态导入稳定。

额外优化建议

在Next.js App Router中,建议使用ES模块语法替代CommonJS:

  1. 修改models/index.js为ES模块:
import Sequelize from 'sequelize';
import configJson from '../config/config.json';
import TeamModel from './team.js';

const env = process.env.NODE_ENV || 'development';
const config = configJson[env];

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

const db = {
  Team: TeamModel(sequelize, Sequelize.DataTypes),
  sequelize,
  Sequelize
};

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

export default db;
  1. API路由中使用ES模块导入:
import { NextResponse } from 'next/server';
import db from '@/models';

export async function GET() {
  const teams = await db.Team.findAll();
  return NextResponse.json(teams);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:07:28