我在ReactJS应用程序上使用sequelize访问我的数据库。按照教程进行操作,以下是我的sequelize初始值设定项,用于加载所有模型,然后使其可用于db
:
"use strict";
var fs = require("fs");
var path = require("path");
var Sequelize = require("sequelize");
var basename = path.basename(__filename);
var env = process.env.NODE_ENV || "development";
var config = require(__dirname + "/../config/config.js")[env];
var db = {};
if (config.use_env_variable) {
var sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
var sequelize = new Sequelize(
config.database,
config.username,
config.password,
config
);
}
fs
.readdirSync(__dirname)
.filter(file => {
return (
file.indexOf(".") !== 0 &&
file !== basename &&
file.slice(-3) === ".js"
);
})
.forEach(file => {
var model = sequelize["import"](path.join(__dirname, file));
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;
这是一个简单的模型:TestModel.js
export default (sequelize, DataTypes) => {
let TestModel = sequelize.define("TestModel", {
id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
name: { type: DataTypes.STRING(32), allowNull: false },
description: { type: DataTypes.STRING(256) }
});
return TestModel;
};
然后我通常可以在我的代码中使用它:
db.TestModel.find(...);
一切正常,直到我需要准备生产捆绑包为止。
我正在使用Webpack来准备作为单个文件交付的生产捆绑包。这样做时,无法在以下位置导入模型文件:
fs
.readdirSync(__dirname)
.filter(file => {
return (
file.indexOf(".") !== 0 &&
file !== basename &&
file.slice(-3) === ".js"
);
})
.forEach(file => {
var model = sequelize["import"](path.join(__dirname, file));
db[model.name] = model;
});
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
..然后db
中没有可用的更多模型,这导致我的数据库访问代码db.TestModel.find(...);
失败,并出现以下错误:TypeError: Cannot read property 'find' of undefined
自然不会导入任何文件(只有我的bundle.js),并且db不包含模型定义。
因此,我需要一种静态导入模型的方法,这是我的尝试:
import TestModel from "./TestModel.js";
.
.
.
db[TestModel.name].associate(db);
尽管可以运行,但它不关联,并且在运行时出现相同的错误。
如何静态关联我的模型以序列化数据库,以便我可以直接以db.ModelName
的身份访问?