Sequelize使用require导入模型时无法正常创建实例问题求助
代码问题说明
1. src/models/message.js 存在两处致命错误
- 顶部第一行导入逻辑错误:
import sequelize from '.message.js'是当前文件导入自身,会直接触发循环引用报错。你导出的是模型工厂函数,sequelize实例和DataTypes都会由index.js调用时作为参数传入,完全不需要在模型文件顶部单独导入。 - 顶部第二行导入无效:从
sequelize/types导入的是TypeScript类型定义,普通JS项目引入会直接报错,无需添加。 - 可选修正:如果你的项目
package.json中配置了"type": "module"(即使用ES模块规范),module.exports属于CommonJS语法,和ES模块的import不兼容,需要替换为ES模块导出。
修正后的src/models/message.js参考:
export default (sequelize, DataTypes) => { const Message = sequelize.define("message", { text: { type: DataTypes.STRING } }) Message.associate = models => { Message.belongsTo(models.User) } return Message }
2. src/models/index.js 存在模块语法混用错误
代码中同时使用了ES模块的import/export语法和CommonJS的require语法,两种规范不能混用:如果是ES模块项目,require方法不存在会直接报错;如果是CommonJS项目,import/export语法会报错。
适配ES模块规范的src/models/index.js参考:
import 'dotenv/config'; import Sequelize from 'sequelize'; import importUser from './user.js'; import importMessage from './message.js'; const sequelize = new Sequelize( process.env.DATABASE, process.env.DATABASE_USER, process.env.DATABASE_PASSWORD, { dialect: 'postgres', }, ); const models = { User: importUser(sequelize, Sequelize.DataTypes), Message: importMessage(sequelize, Sequelize.DataTypes), } Object.keys(models).forEach(key => { if ('associate' in models[key]) { models[key].associate(models); } }); export { sequelize }; export default models;
如果你的项目使用CommonJS规范,只需要把所有import替换为require、export替换为module.exports即可,不要混写两种模块语法。
内容的提问来源于stack exchange,提问作者Peter Malik
相关产品推荐
相关产品推荐

