序列化ORM:如何将模型静态关联到数据库?

时间:2018-06-22 16:41:38

标签: javascript node.js express sequelize.js

我在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的身份访问?

0 个答案:

没有答案