Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Sequelize-尝试使模型动态化_Node.js_Sequelize.js - Fatal编程技术网

Node.js Sequelize-尝试使模型动态化

Node.js Sequelize-尝试使模型动态化,node.js,sequelize.js,Node.js,Sequelize.js,我一直在尝试自动创建sequelize模型,方法是使用我可以将定义传递到的通用模型来创建它们,而不是专门为每个模型创建一个模型文件 我有一组模型定义,如下所示: const modelDefinitions = [ { name: "User", fieldDefinitions: [ { name: "first_name",

我一直在尝试自动创建sequelize模型,方法是使用我可以将定义传递到的通用模型来创建它们,而不是专门为每个模型创建一个模型文件

我有一组模型定义,如下所示:

const modelDefinitions = [
    {
        name: "User",
        fieldDefinitions: [
            {
                name: "first_name",
                label: "First Name",
                column_type: Sequelize.DataTypes.STRING,
            },
            {
                name: "last_name",
                label: "Last Name",
                column_type: Sequelize.DataTypes.STRING,
            },
            {
                name: "email",
                label: "Email",
                column_type: Sequelize.DataTypes.STRING,
            },
            {
                name: "password",
                label: "Password",
                restricted: true,
                column_type: Sequelize.DataTypes.STRING,
            },
        ],
    },
    {
        name: "Audit",
        fieldDefinitions: [
            {
                name: "ref",
                column_type: Sequelize.DataTypes.STRING,
                label: "Audit Ref",
            },
            {
                name: "result",
                column_type: Sequelize.DataTypes.STRING,
                label: "Result",
            },
            {
                name: "auditor_id",
                column_type: Sequelize.DataTypes.INTEGER,
                label: "Auditor",
            },
        ],
    },
];
当我的模型数组只包含一个模型时,它工作得非常好,但当我有多个模型时,先前定义的模型的GenericModel就会“更改”为列表中初始化的最后一个模型

我对node是新手,所以我认为我要么缺少了一些东西,要么出现了某种模型缓存,这意味着GenericModel的所有实例都变成了它初始化为最后一个的对象

请参阅下面的示例(注释掉的代码是我用来定义模型的代码,reduce是我定义这些模型的新方法)

My
console.log()
返回以下内容-请注意,两者都是

{ 
 models: {
   User: Group,
   Group: Group
 }
}
如您所见,最后一个模型的定义是什么,前面的模型继承了它,而不是保留我最初定义的模型

但我真正想要的是:

{ 
 models: {
   User: User,
   Group: Group
 }
}

如果我的列表中只有用户,那么它就可以正常工作。

我最终成功地实现了这一点

我认为我的问题是,我的GenericModel被视为一个单例,因此为了避免这个问题,我将GenericModel从扩展Sequelize.Model改为使用构造函数创建一个新类来使用我的参数,然后在新类上创建一个方法来返回Sequelize模型

主要的变化不是用
GenericModel.init()
定义模型,而是调用
sequelize.define(modelName,attributes,options)

所以我的地图现在看起来像这样:

const models = modelDefinitions.reduce((acc, modelDef) => {
    return { ...acc, [modelDef.name]: new GenericModel(sequelize, modelDef).getDBModel() };
}, {});
我的班级:

class TestModel {
    constructor(sequelize, modelDef) {
        this.sequelize = sequelize;
        this.modelDef = modelDef;
        this.modelName = modelDef?.name;
        this.definitions = modelDef?.fieldDefinitions;
        this.restrictedFieldList = this.definitions.filter((field) => field?.restricted).map((definition) => definition.name);
    }

    getDBModel() {
        const model = this.sequelize.define(
            this.modelName,
            this.definitions.reduce((acc, definition) => {
                return { ...acc, [definition.name]: definition.column_type };
            }, {}),
            {
                defaultScope: {
                    attributes: {
                        exclude: this.restrictedFieldList,
                    },
                },
                sequelize: this.sequelize,
                modelName: this.modelName,
            }
        );
        return model;
    }
}```
class TestModel {
    constructor(sequelize, modelDef) {
        this.sequelize = sequelize;
        this.modelDef = modelDef;
        this.modelName = modelDef?.name;
        this.definitions = modelDef?.fieldDefinitions;
        this.restrictedFieldList = this.definitions.filter((field) => field?.restricted).map((definition) => definition.name);
    }

    getDBModel() {
        const model = this.sequelize.define(
            this.modelName,
            this.definitions.reduce((acc, definition) => {
                return { ...acc, [definition.name]: definition.column_type };
            }, {}),
            {
                defaultScope: {
                    attributes: {
                        exclude: this.restrictedFieldList,
                    },
                },
                sequelize: this.sequelize,
                modelName: this.modelName,
            }
        );
        return model;
    }
}```