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

导入sequelize报错:模块未提供名为'sequelize'的导出

问题原因

你的项目配置了"type": "module",所有.js文件默认以ES模块规范解析,但./models/index.js仍使用CommonJS规范导出(module.exports = db),而你在Server.js里用命名导入import { sequelize } from './models/index.js'会触发报错——因为CommonJS的导出在ES模块中被视为默认导出,并非单独的命名导出项。

解决方案

两种修复方式任选其一即可:

方式一:修改Server.js的导入逻辑

直接导入默认导出的db对象,再解构出sequelize:

// 替换原来的 import { sequelize } from './models/index.js';
import db from './models/index.js';
const { sequelize } = db;

或者简化为直接使用db.sequelize:

// 导入语句改为
import db from './models/index.js';

// 数据库认证部分改为
db.sequelize
  .authenticate()
  .then(() => console.log('Database connected!!'))
  .catch((err) => console.log(err))

方式二:将models/index.js转为ES模块规范

把所有CommonJS语法替换为ES模块语法:

// 替换顶部require为import
import fs from 'fs';
import path from 'path';
import { Sequelize } from 'sequelize';
import process from 'process';
import config from '../config/config.json' assert { type: 'json' }; // ES模块导入JSON需声明类型

// 替换CommonJS的__filename和__dirname
const basename = path.basename(new URL(import.meta.url).pathname);
const dirname = path.dirname(new URL(import.meta.url).pathname);

const env = process.env.NODE_ENV || 'development';
const db = {};

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);
}

// 替换require加载模型文件为ES模块动态导入
fs
  .readdirSync(dirname)
  .filter(file => {
    return (
      file.indexOf('.') !== 0 &&
      file !== basename &&
      file.slice(-3) === '.js' &&
      file.indexOf('.test.js') === -1
    );
  })
  .forEach(async file => {
    const modelDef = await import(`./${file}`);
    const model = modelDef.default(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为ES模块导出
export default db;
// 可选:添加命名导出,让原导入语句无需修改
export const { sequelize, Sequelize } = db;

修改后,你原来的import { sequelize } from './models/index.js'就能正常工作(如果添加了命名导出的话)。

补充说明

ES模块与CommonJS的导出/导入逻辑不兼容:CommonJS的module.exports对应ES模块的export default,而ES模块的命名导入需要对应export const xxx这类显式命名导出。如果保留CommonJS格式的models文件,必须通过默认导入获取db对象,再从中提取sequelize属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 21:20:29