【发布时间】:2021-05-24 15:43:40
【问题描述】:
我在一个应用中同时使用 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' 在第 17 行,这是语句:var model = require(path. join(__dirname, file))(sequelize, Sequelize.DataTypes); 阅读了一些与此问题相关的posts,我发现我需要安装@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)
但是当我运行应用程序时,错误仍然出现。我错过了什么或没有正确设置?
【问题讨论】:
-
你不需要为 node.js 程序安装 babel!您只需要使用 new 而不是将类作为函数调用(就像错误告诉您的那样):
const ThingThatIsAClass = require(path.join(__dirname, file)); const model = new ThingThatIsAClass(sequelize, Sequelize.DataTypes);不要试图在一行代码上塞进太多东西。它很难阅读,而且很容易错过像这样的小错误。 -
我为我的无能道歉,我不知道。我知道错误在于调用构造函数的方式,但从未拆分语句。谢谢!
-
语句不用拆分,也可以写
new (require(…))(…),但更难理解。 -
@CodiClone 不需要道歉,编程很难,缺乏经验不是道德上的失败:)
标签: javascript node.js ecmascript-6 sequelize.js babeljs