Sequelize.define() 不是函数?

Posted

技术标签:

【中文标题】Sequelize.define() 不是函数?【英文标题】:Sequelize.define() is not a function? 【发布时间】:2018-09-03 08:39:59 【问题描述】:

尝试在 node.js 网络服务器中使用 Sequelize。

我已经像这样在 index.js 中初始化了 Sequelize 连接池

index.js

const config = require('./config/config');
const app = require('./config/express');
const Sequelize = require('sequelize');

const sequelize = new Sequelize(config.mysql.database, config.mysql.user, config.mysql.pass, 
  host: config.mysql.host,
  dialect: 'mysql',
  operatorsAliases: false,

  pool: 
    max: 5,
    min: 0,
    acquire: 30000,
    idle: 10000
  ,
);

sequelize
  .authenticate()
  .then(() => 
    console.log('Connection has been established successfully.'); // eslint-disable-line no-console
  )
  .catch((err) => 
    console.error('Unable to connect to the database:', err); // eslint-disable-line no-console
  );

module.exports =  app, sequelize ;

user.js 模型

const sequelize = require('sequelize');
const DataTypes = require('mysql');
/**
 * User model
 */
const User = sequelize.define('user', 

  id: 
    type: DataTypes.INTEGER,
  ,
  name: 
    type: DataTypes.STRING,
  ,
  email: 
    type: DataTypes.STRING,
  ,
  lastEmail: 
    type: DataTypes.TIME,
  
);

尝试启动服务器时出现以下错误

TypeError: sequelize.define is not a function ... user.js

我猜 sequelize 对象没有被全局化,但是我在创建模型之前测试了连接,它很好。

【问题讨论】:

【参考方案1】:

在 user.js 中,您试图在不是实例的东西上使用实例方法 .define()。在 index.js 中,您确实通过调用构造函数来创建实例,但这在 user.js 中不可用。这里的解决方案实际上取决于您要完成的工作以及您希望如何组织代码。通常 index.js 是您的应用程序的入口点,因此从那里导出 appsequelize 有点不寻常,但如果这是您想要做的,那么在您的 user.js 文件中您可以需要 index.js,并使用您在此处定义的 sequelize 实例。在这种情况下,您的 index.js 将保持不变,而 User.js 可能只是在第一个 require 中有变化:

const sequelize = require('index.js').sequelize;
const DataTypes = require('mysql');

/**
 * User model
 */
const User = sequelize.define('user', 

  id: 
    type: DataTypes.INTEGER,
  ,
  name: 
    type: DataTypes.STRING,
  ,
  email: 
    type: DataTypes.STRING,
  ,
  lastEmail: 
    type: DataTypes.TIME,
  
);

我不一定推荐这种方法,因为它确实取决于您要做什么(我想您可能会遗漏一些代码?),但它确实显示了一种使用从 user.js 中的 index.js 实例化 sequelize 对象

【讨论】:

谢谢迈克。那么最好的方法是什么? 我想问题是你想要做的“这个”是什么?例如,您是否在某处定义了使用用户模型的路由处理程序。如果是这样,你能分享那个代码吗?此外,这里似乎有关于此主题的相关堆栈溢出问题:***.com/questions/12487416/…。 是的,我定义了用户路由和用户控制器。我从使用过的 mongodb 复制的原始示例,但是我希望将它交换到 mysql【参考方案2】:

我遇到了同样的问题..它对我有用..

module.exports = (DataTypes , sequelize) => 
const User = sequelize.define('user', 
  id: 
    type: DataTypes.INTEGER,
  ,
  name: 
    type: DataTypes.STRING,
  ,
  email: 
    type: DataTypes.STRING,
  ,
  lastEmail: 
    type: DataTypes.TIME,
  
)
return User;
;

【讨论】:

以上是关于Sequelize.define() 不是函数?的主要内容,如果未能解决你的问题,请参考以下文章

不创建带有 Sequelize 的外键

Sequelize - 在验证模型的关联时获取正确的路径

有没有办法使用 Sequelize 一次将多个嵌入式模型保存在数据库中

Sequelize 默认排除

Sequelize.js 外键

Sequelize:在关联中排序