【问题标题】:Where should I write queries in model or controller (sequelize)?我应该在模型或控制器中在哪里编写查询(续集)?
【发布时间】:2018-02-02 05:25:07
【问题描述】:

我试图弄清楚我应该在使用sequalize 作为 ORM 的节点 js 应用程序中的哪里编写查询。

比如我有一个模型地址,我这样写数据:

let adr = await Address.create({street, number, city, state, country})

我应该在获取数据的控制器中还是在模型中编写这段代码,然后将(例如完整的对象地址)传递给模型的方法?最佳做法是什么?

我认为最好在模型中编写它,因为我可以在许多控制器中使用相同的代码。但也许还有其他一些限制。

【问题讨论】:

    标签: javascript node.js orm sequelize.js


    【解决方案1】:

    实际上你应该使用repository。背后的想法是制作一个抽象数据库的模块,只需将其作为依赖项注入,然后在控制器中使用存储库,一个简短的示例可以是这样的。

    // repository.js
    
    module.exports = (db) => {
       const findUserById = (id) => {
            // db query your user by id
       }
    
       const createUser = (data) {
           // db insert a new user
       }
    
       // ... other repository functions to deal with the database
    
       return Object.create({
         findUserById,
         createUser,
         // ...
       })
    } 
    

    然后在您的控制器中,您将通过提供正确的数据库连接来使用存储库。

    const repository = require('./repository.js')(dbConnection);
    
    app.get('/users/:id', (req, res) => {
       repository.findUserById(req.params.id);
       // ...
    })
    

    通过这种方式,您可以轻松地通过模拟数据库来测试您的代码,甚至可以使用良好的值进行测试。当您需要将数据库从 mysql 更改为 mongodb 时,您将抽象您的数据库连接和其他重要功能,您将只更改存储库而不是整个应用程序或控制器。

    所以一个好的做法是使用sequelize 的存储库,也有一种方法可以做到这一点。

    var db = require('../models');
    
    var UsersRepository = {
        findByEmail: function(email) {
            return db.User.findAll({
                where: {
                    email: email
                }
            })
        }
    }
    
    module.exports = UsersRepository;
    

    【讨论】:

    • 每个模型或整个应用程序有一个存储库是一种好习惯吗?
    • 每个模型都有他的存储库
    • 这听起来很合理。在这种情况下,除了数据模式和钩子,我应该在模型中添加什么?
    • 我个人使用/repository/user-repository.js
    • 我理解正确,在控制器中您使用存储库,而在存储库中您使用模型?
    猜你喜欢
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多