#angularjs #node.js #express #mean-stack
#angularjs #node.js #экспресс #mean-stack
Вопрос:
В моем приложении MEAN у меня есть модель продукта, подобная этой :
product: {
field: //some string value//,
reviews: //an array of review objects//
}
Теперь я собираюсь применить различные ограничения для сохранения field
и reviews
, поэтому мои конечные точки API будут такими :
/* specific route for updating reviews */
router.put('/products/reviews/:id', checkRightsToUpdateReviews, updateProductReviews);
/* specific route for updating field */
router.put('/products/:id', checkRightsToUpdateField, updateProductField);
Эти конечные точки достигаются моим сервисом Angular productData
, соответственно, с помощью методов productData.updateReview(product)
и productData.updateField(product)
.
Таким образом, в моем productData
сервисе я использую два ресурса :
Один с URL /products/reviews/:id
для updateReview
метода, а другой с URL /products/:id
для updateField
метода.
Я чувствую, что неправильно распределяю проблемы.
Проблема возникает из-за того, что в моей модели есть поля, которые необходимо обрабатывать по-разному. Но для меня имеет смысл иметь все операции CRUD для products
в одном сервисе.
Что было бы, очевидно, более элегантным решением для этого?
Ответ №1:
Я бы использовал одно промежуточное программное обеспечение авторизации для проверки в обоих случаях.
router.put('/products/:id', checkUpdateRights, updateProduct);
function checkUpdateRights(req, res, next){
if(req.body.reviews amp;amp; !hasReviewRights(req)){ // check only if reviews exists in body
res.status(401).send({ error: "Unauthorized to update product reviews" });
}
if(!hasUpdateRights(req)){ // for other fields
res.status(401).send({ error: "Unauthorized to update product" });
}
else{
return next();
}
};
function hasReviewRights(req){
// return true or false
};
function hasUpdateRights(req){
// return true or false
};