Я реализую систему upvote, которая ограничивает IP. До сих пор, маршрут для upvoting одно сообщение содержит 4 общее количество запросов, чтобы выполнить следующие действия:Эффективный запрос в Sequelize
- Посмотрите на уже существующую upvote с таким же сообщения дан и IP и потерпеть неудачу, если таковой существует
- otherwise-
<ол начать = "2">Я чувствую, что последние два шага могут быть объединены, однако, если я просто верну пост после того, как связал надпись с ним, он не включается, что имеет смысл, потому что, когда оно было обнаружено, у него не было связанной связи. Вот что я сейчас имею, и я чувствую, что это очень неэффективно для одного upvote.
router.get('/posts/:id/upvote', function(req, res) {
var id = req.params.id;
var query_options = {
where: {
id: id
},
include: common_includes
};
// Look for already existing upvote with same PostId and IP.
Upvote.findOne({ where: { ip: req.ip, PostId: id }}).then(function(upvote) {
if (upvote !== null) return res.fail('Already upvoted');
// No upvote exists, create one
Upvote.create({
ip: req.ip
}).then(function(upvote) {
// Find post to associate upvote with
Post.findOne({ where: { id: id }}).then(function(post) {
// Associate upvote to post
upvote.setPost(post).then(function() {
// Query again to get updated post to be returned
Post.findOne(query_options).then(function(post) {
return res.pass(formatPost(post));
}).error(function(err) {
console.log(err);
return res.fail('Server error');
});
}).error(function(err) {
console.log(err);
return res.fail('Server error');
});
}).error(function(err) {
console.log(err);
return res.fail('Server error');
});
}).error(function(err) {
console.log(err);
return res.fail('Server error');
});
});
});
Только один обещающий наконечник, Вам не нужно вводить '.error' после всего. Вы можете «вернуть» обещания, а затем обработать 'error' только в конце, так как у вас есть такая же функция –
@MeghParikh у вас есть небольшой пример этого? Я как бы понимаю, что вы имеете в виду, но как я могу использовать 'res', если я объявляю общий ответ об ошибке за пределами маршрута? – Jordan
см. Http://stackoverflow.com/questions/38080111/expressjs-promises-and-error-handling-middleware и в реестре, я использую 'catch' только один раз –