我应该在模型或控制器中写入查询(sequelize)?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我应该在模型或控制器中写入查询(sequelize)?相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

答案

其实你应该使用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;

以上是关于我应该在模型或控制器中写入查询(sequelize)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Sequelize 中的导入模型中创建自定义方法或函数

Sequelize - 我必须在模型和查询中都指定“as”吗?

Sequelize 不返回 queryAsync 对象

仅从 sequelize 原始查询而不是模型实例中获取 dataValues

如何使用node.js控制sequelize中的内连接查询?

Laravel - 在控制器或模型中构建查询?对于大型网络应用