我应该在哪里编写模型或控制器中的查询(续集)?



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

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

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;

最新更新