问题描述
在使用 Sequelize ORM(Object Relational Mapping 对象关系映射)库时,出现如下错误信息:
TypeError: Class constructor Model cannot be invoked without 'new'
该错误信息通常出现在代码中执行下列语句时:
Sequelize.define('table', columns, options);
原因分析
在使用 Sequelize 定义一个新的数据表时,会通过 Sequelize.define
方法来实现。这个方法返回的是一个用于表示数据表模型的 JavaScript 类型。而 Sequelize
库内部基于这个模型类的定义来生成用于访问数据表的具体实现。
不过,在某些情况下,当调用 Sequelize.define
方法时,会出现上述错误信息。这是由于在调用这个方法时,将其当做普通函数使用,而不是作为类构造函数进行调用。因此,JavaScript 解释器就会抛出上述错误。
解决方案
要解决这个问题,需要明确知道 Sequelize.define
方法返回的是一个类构造函数,我们需要使用关键字 new
来实例化这个类,并且将返回值赋值给变量,以便我们可以进一步操作这个 Sequelize 模型对象。
以下是一个正确使用 Sequelize.define
方法的示例代码:
-- -------------------- ---- ------- ----- --------- - --- --------------------- ----------- ----------- - ----- ------------ -------- ------- --- ----- ---- ------- --------------- -- ----------- ---------- ----------------- --------- ---------------- -- - ---------- ---------- ------ --- ------ -- -- - ----- ----------------- ----- ---- - ----- ------------- ---------- ------- --------- ----- --- --------------------------- -----
在这个示例代码中,我们定义了一个 User
类,该类继承自 Sequelize.Model 类,这个类上面我们可以使用 Sequelize.define
方法来声明模型的属性和选项。在 User 类的属性列表中,我们通过 Sequelize.STRING
来定义数据表的字段类型。在最后的小括号内,我们传入了一个选项对象,用于指定数据表的名字。
在类定义完成后,我们需要调用 sequelize.sync()
方法来初始化数据表,并将其同步到数据库中。在数据表同步完成后,我们可以使用 User.create
方法来向数据表中插入一个新的数据行。
总结
在使用 Sequelize ORM 库时,如果在定义数据表时出现 Class constructor Model cannot be invoked without 'new'
的错误提示,通常是由于没有正确使用 Sequelize.define
方法所导致的。要解决这个问题,需要适当修改代码,正确使用关键字 new
来实例化生成的 Sequelize 模型对象。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6502799395b1f8cacdfc10d4