导入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
相关产品推荐
相关产品推荐

