Придерживаясь архитектуре Controller -> Service -> Model, то куда лучше вынести функций с запросами на удаленную бд?
Я использую ORM sequelize для работы с моей локальной БД. В результате получается такая архитектура:
/controllers/user.controller.js // Работа с http
/services/user.service.js // Бизнес логика
/models/User.js // sequelize schema
Для работы с удаленной БД мне нужно выполнять http запросы на другой сервер такая логика подходит для Service или все таки выписать как Model?
Запрос выполняется через axios:
$api.get(`/user/${userId}`).then((res) => res.data);
Код:
controller:
exports.controller = async (req, res, next) {
try {
const {userId} = req.user;
const data = await service.getInfo(userId);
return res.status(200).json(data);
} catch(e) {
next(e);
}
}
service:
exports.getInfo = async (userId) => {
const candidate = await UserModel.findOne({where: {userId}});
if (!candidate) throw ApiError.notFound('Пользователь не найден');
// Этот код оставить здесь или вынести в model.js ?
const userData = await $api.get(`/user/${userId}`).then((res) => res.data);
// =====
const {status, data, message} = userData;
if (!status) throw ApiError.internal(message);
return data;
}
model:
exports.User = sequelize.define(
'users', {...});
// Может стоит сюда вынести функцию?
exports.getUserInfo = (userId) =>
$api.get(`/user/${userId}`).then((res) => res.data);
Я понимаю, что бизнес логика должная находится в Service, но что если удаленная Api сменит url или добавит параметры, заголовки, сменит метод запроса? Проще будет зайти в model.js и подправить функцию вместо того чтобы в service копаться? Как вы считаете?
Ответы (1 шт):
Правильно будет вынести эту логику в отдельный модуль. Он знает и куда делать запрос и как его преобразовать если нужно и т.д. А выставляет он интерфейс, с помощью которого можно получить уже объект в терминах нашей бизнес-логики (т.е. User):
api.js:
exports.getUserInfo = async (userId) => {
res = await $api.get(`/user/${userId}`);
return res.data;
}
service.js:
exports.getInfo = async (userId) => {
...
const user = await api.getUserInfo(userId);
...
return data;
}