TypeError: Class constructor model cannot be invoked without 'new'
TypeError: Class constructor model cannot be invoked without 'new'
我正在使用 Sequelize 以及 Node 和 JavaScript一个应用程序。如您所知,当您执行 sequelize-init
时,它会创建 config、migrations、models 和 seeders 文件夹。在 models 文件夹中,有一个 index.js
文件(由 cli 生成),它负责从当前文件夹中读取所有模型及其关联:
index.js
'use strict';
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const sequelize = require('../database/connection');
const db = {};
fs
.readdirSync(__dirname)
.filter(file => {
return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
})
.forEach(file => {
const model = require(path.join(__dirname, file))(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 = db;
当我运行我的应用程序时,出现错误:TypeError: Class constructor model cannot be invoked without 'new' at line 17这是语句:var model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes); Reading some of the 与此问题相关 我发现我需要安装 @babel/preset-env
包和 @babel/cli, @babel/core, @babel/node
。我还在根目录下创建了一个.babelrc
文件,包含如下代码:
.babelrc
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"esmodules": true
}
}
]
]
}
并将package.json
内scripts
标签的start
选项更新为:"nodemon --exec babel-node app.js"
(我不使用webpack)
但是当我运行应用程序时,错误仍然出现。我错过了什么或没有正确设置?
注意:最后检查为什么部分!如果你想知道。
问题
问题是 ES6 类 => 没有转译成 ES5 的全部功能! Sequelize依赖于一些特性
或
使用 Sequelize.import
代替要求!不! (Babel 或任何转译器与 require(或 es 导入)一起工作,以及 sequelize.import 工作如何导致问题!)!
回答
我猜你正在使用
export class Course extends Model {} // <== ES6 classes
Course.init({
是你的 babel 配置导致的!
您可以在这个 github 线程上查看 comment
这对那个人有用
{
"presets": [
["env", {
"targets": {
"node": "current"
}
}]
]
}
或
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": true
}
}
]
]
}
让 babel 使用 ES6 类!
注意如果另一方面你只是坚持 sequelize.define()
方式
export const User = sequelize.define('User', {
// Model attributes are defined here
firstName: {
type: DataTypes.STRING,
allowNull: false
},
它在 ES5 中工作得很好!
不要使用Sequelize.import导入模型
如果你正在做,那就不要!使用 require
或 es import
!转译器不直接处理 Sequelize.import!这似乎会导致问题
Comment 表示
对我来说是因为 ES6 和 Typescript
打字稿
默认目标是 ES5
!
将其更改为 ES6+!全部开始工作!
例如
"target": "ES2021",
带有 sequelize.define 的 ES5 有效
知道 sequelize.define 的 ES5 工作得很好!
带有 Class 扩展的 ES5 不工作
插图
ES6+ 始终有效
为什么! Babel 通常不会正确转换!! ???
你可以看到在这个githubcomment
It turns out that an ES6-class transpiled by babel can't extend a real ES6 class (The Sequelize.Model ES6-class for example).
So class MyEntity extends Sequelize.Model { ... } won't work if MyEntity is transpiled into ES5.
这里的 Whosebug 答案解释得更好:
Due to the way ES6 classes work, you cannot extend a native class with a transpiled class. If your platform supports native classes
您可以看到更深入的内容,了解为什么会出现这种情况以及这种情况如何发生 transpilation of ES6 Class to ES5 can be done to support full features and compatiblity
!在下面的链接中:
https://github.com/microsoft/TypeScript/issues/17088
https://github.com/microsoft/TypeScript/issues/15397
这里有一篇文章 (comparing-different-ways-of-transpiling-es6-class-to-es5) 详细介绍了该主题
我正在使用 Sequelize 以及 Node 和 JavaScript一个应用程序。如您所知,当您执行 sequelize-init
时,它会创建 config、migrations、models 和 seeders 文件夹。在 models 文件夹中,有一个 index.js
文件(由 cli 生成),它负责从当前文件夹中读取所有模型及其关联:
index.js
'use strict';
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const sequelize = require('../database/connection');
const db = {};
fs
.readdirSync(__dirname)
.filter(file => {
return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
})
.forEach(file => {
const model = require(path.join(__dirname, file))(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 = db;
当我运行我的应用程序时,出现错误:TypeError: Class constructor model cannot be invoked without 'new' at line 17这是语句:var model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes); Reading some of the @babel/preset-env
包和 @babel/cli, @babel/core, @babel/node
。我还在根目录下创建了一个.babelrc
文件,包含如下代码:
.babelrc
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"esmodules": true
}
}
]
]
}
并将package.json
内scripts
标签的start
选项更新为:"nodemon --exec babel-node app.js"
(我不使用webpack)
但是当我运行应用程序时,错误仍然出现。我错过了什么或没有正确设置?
注意:最后检查为什么部分!如果你想知道。
问题
问题是 ES6 类 => 没有转译成 ES5 的全部功能! Sequelize依赖于一些特性
或
使用 Sequelize.import
代替要求!不! (Babel 或任何转译器与 require(或 es 导入)一起工作,以及 sequelize.import 工作如何导致问题!)!
回答
我猜你正在使用
export class Course extends Model {} // <== ES6 classes
Course.init({
是你的 babel 配置导致的!
您可以在这个 github 线程上查看 comment
这对那个人有用
{
"presets": [
["env", {
"targets": {
"node": "current"
}
}]
]
}
或
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": true
}
}
]
]
}
让 babel 使用 ES6 类!
注意如果另一方面你只是坚持 sequelize.define()
方式
export const User = sequelize.define('User', {
// Model attributes are defined here
firstName: {
type: DataTypes.STRING,
allowNull: false
},
它在 ES5 中工作得很好!
不要使用Sequelize.import导入模型
如果你正在做,那就不要!使用 require
或 es import
!转译器不直接处理 Sequelize.import!这似乎会导致问题
Comment 表示
对我来说是因为 ES6 和 Typescript
打字稿
默认目标是 ES5
!
将其更改为 ES6+!全部开始工作!
例如
"target": "ES2021",
带有 sequelize.define 的 ES5 有效
知道 sequelize.define 的 ES5 工作得很好!
带有 Class 扩展的 ES5 不工作
插图
ES6+ 始终有效
为什么! Babel 通常不会正确转换!! ???
你可以看到在这个githubcomment
It turns out that an ES6-class transpiled by babel can't extend a real ES6 class (The Sequelize.Model ES6-class for example).
So class MyEntity extends Sequelize.Model { ... } won't work if MyEntity is transpiled into ES5.
这里的 Whosebug 答案解释得更好:
Due to the way ES6 classes work, you cannot extend a native class with a transpiled class. If your platform supports native classes
您可以看到更深入的内容,了解为什么会出现这种情况以及这种情况如何发生 transpilation of ES6 Class to ES5 can be done to support full features and compatiblity
!在下面的链接中:
https://github.com/microsoft/TypeScript/issues/17088
https://github.com/microsoft/TypeScript/issues/15397
这里有一篇文章 (comparing-different-ways-of-transpiling-es6-class-to-es5) 详细介绍了该主题