Node.js 如何使用Sequelize在Express中创建常见的CRUD操作?

Node.js 如何使用Sequelize在Express中创建常见的CRUD操作?,node.js,express,sequelize.js,Node.js,Express,Sequelize.js,我想用Sequelize在Express js中创建常见的crud操作。 我创建了getAll函数,如下所示 exports.getAll = (module, res,next) => { module .findAndCountAll({ where: { CreatedBy: 1, isDeleted: false, isActive

我想用Sequelize在Express js中创建常见的crud操作。 我创建了getAll函数,如下所示

 exports.getAll = (module, res,next) => {   
    module
        .findAndCountAll({
            where: {
                CreatedBy: 1,
                isDeleted: false,
                isActive: true
            },
            offset: 0,
            limit: 10,
        }).then((result) => {
            res.status(200).json({
                message: "data Fetched from database",
                statusCode: 200,
                result: result,
            });
        }).catch((error) => {
            console.log(error);
        });
}
req.user
    .createCategory({
        name: name,
    })
我在控制器函数中调用这个公共函数,如下所示,通过传递模型名称,例如category

crudOperations.getAll(category, res);
它工作得很好。但是如何为post数据创建函数呢? 对于发布数据,我想使用Sequelize的神奇方法(因为一个用户可以与许多类别关联,如下所示)

例如,我想添加关于用户的类别,所以我想使用下面的魔术方法

 exports.getAll = (module, res,next) => {   
    module
        .findAndCountAll({
            where: {
                CreatedBy: 1,
                isDeleted: false,
                isActive: true
            },
            offset: 0,
            limit: 10,
        }).then((result) => {
            res.status(200).json({
                message: "data Fetched from database",
                statusCode: 200,
                result: result,
            });
        }).catch((error) => {
            console.log(error);
        });
}
req.user
    .createCategory({
        name: name,
    })
  • 如何将user和createCategory作为参数传递给公共函数
  • 如何将数据传递给函数
  • 为CRUD创建公共函数是否是一种良好的做法?还是应该为每个模块提供编写功能

我正在构建应用程序架构和设计。当我们谈论创建公共方法或服务时,它将完全取决于我们正在执行的用例或操作类型

Sequelize已经有了执行常见操作的基本方法。以下是我的想法,它可能会给你的道路带来更多的光明。请参考下面的伪代码

回答1。

以下是可能对您有所帮助的方法,即如何组织您的功能。这是我的基本想法,因此可能存在错误的空间

BaseModel.helper.js

Data.services.js

我所描述的上述方法有一个好处,就是如果您必须设法集中错误处理程序,那么您不必到处进行错误处理。当发生错误时,它会抛出一个错误,并通过集中Express的错误处理程序进行捕获

以上常见的db操作类别是根据我的经验和我们执行的操作频率构建的。我知道有比我们预期的更多的可能性,但有了这种方法,我建议你可能不会面临很多障碍

答复2。您应该在服务级别创建一个完整的限定查询对象。一旦它的构建在服务级别,那么只有您将它传递给我们的BaseModelHelper

答复3。同样,您应该在服务级别创建数据对象。如果数据对象是从多个表生成的,则首先在服务级别进行封装,然后应传递给BaseModelHelper方法

答复4。是的,我也喜欢同样的。但有一件事你应该记住,总有改进的余地。如果您希望为每个模块创建一个方法,那么您应该将此BaseModelHelper复制到其他任何地方。我建议您在服务级别继承该文件

所有数据库操作对象都是在服务级别生成的,而不是在控制器级别生成的。您的数据库服务和对象准备服务可能不同,因此它将提供更清晰的图像。对象准备服务的作用域可能包括更多不同的服务


同样,上述方法是我的思考过程,我根据我的经验向您提出建议。同样,还有更多的改进空间,您可能需要创建。

Hi Dipak,感谢您的见解,但我的问题是-当我们添加与其他模型的关联时,Sequelize提供了一组方法。例子。如果我们在用户和类别中设置一对多关系,那么它将有一组新的方法。在这种情况下,我们如何将模型传递给公共函数。示例:req.user.createCategory({name:name,})您希望传递的内容是什么?能否以您的方式给我一个示例,说明您在查询中实际需要哪些内容。现在检查我的更新答案,我已经更新了它。当您想从另一个表中获取数据时,或者以用户有多个宠物为例。在这种情况下,您应该在include数组中传递模型名,它将起作用。我对typeorm也做了同样的事情,而且效果很好。第二个教程。hasMany(Comment,{as:“comments”});Comment.belongsTo(教程,{foreignKey:“tutorialId”,as:“Tutorial”,});是模型级别的声明,因此您应该传递include[]
const BaseModelHelper = require("BaseModel.helper.js);

class DataServices{    

    static async add(){
        // Owner table entry
        const {id} = await BaseModelHelper.create({
            model: "Owner'
            properties:{
                name: 'Loren',
                role: 'admin',
            },            
        });
        // Cat table entry
        const {id: petId} = await BaseModelHelper.create({
            model: "Pet'
            properties:{
                owner_id: 'c0eebc45-9c0b',                
                type: 'cat',
            } 
        });
    }


    static async findWithRelations(){
        const arrData = await BaseModelHelper.find({
            model: 'User',
            where: {
                role: 'admin'
            },
            attributes: ['id', 'username', 'age'],
            include: [{
                model: pet,
                through: {
                    attributes: ['createdAt', 'startedAt', 'finishedAt'],
                    where: {completed: true}
                }
            }]
        });
    }


    static async findBelongs(){
        const arrData = await BaseModelHelper.find({
            model: 'User',
            where: {
                role: 'admin'
            },
            attributes: ['id', 'username', 'age']
        });
    }


    static async update(){        
        const arrData = await BaseModelHelper.update({
            Model: 'Pet',
            newData:{
                name: 'lina',
            }
            where: {
                name: 'suzi',
            }
        });
    }

    static async delete(){
        const arrData = await BaseModelHelper.delete({
            Model: 'Pet',
            where: {
                name: 'lina',
            }
        });
    }

    
}

module.exports = DataServices;