Допустим, у меня есть модель под названием User
, которая не требует пояснений. В нашей модели есть поле под названием contacts
, которое содержит список идентификаторов контактов. Теперь для добавления контакта можно использовать этот маршрут express:
router.post("/contacts/add", async (request, response) => {
try {
let user = await User.findOne({
sessionSecret: request.body.claimedSessionSecret,
});
if (!user) {
return response.json({ result: false, error: "An error occured." });
}
let contact = await User.findOne({ email: request.body.email });
if (!contact) {
return response.json({ result: false, error: "User not found." });
}
user.contacts.push(contact._id);
await user.save();
return response.json({ result: true });
} catch (e) {
debug(e);
response.json({ result: false, error: "An error occured." });
}
});
Другим вариантом будет извлечение сути этого маршрута в метод stati c нашей модели User
, а затем используя это вместо этого. Вот так:
// in routes
router.post("/contacts/add", async (request, response) => {
try {
const isContactAdded = await User.addContact(userID, contactID);
return response.json({ result: true });
} catch (e) {
debug(e);
response.json({ result: false, error: "An error occured." });
}
)};
// in model
UserSchema.statics.addContact = async function(userID, contactID) {
...
};
Теперь вопрос в том, какой подход является лучшим дизайном кода и почему?
- Должен ли я извлечь его в метод пользователя только потому, что я изменяю данные или это должно произойти только в том случае, если операторов слишком много?
- Поскольку мы можем использовать такие функции, как
save()
и findOne()
, только после создания экземпляра модели, не следует ли нам обновлять БД так же, как я сделал выше (первый подход)? Потому что в противном случае у нас было бы много static
методов в нашей модели.