2016-06-28 4 views
1

Я реализую систему upvote, которая ограничивает IP. До сих пор, маршрут для upvoting одно сообщение содержит 4 общее количество запросов, чтобы выполнить следующие действия:Эффективный запрос в Sequelize

  1. Посмотрите на уже существующую upvote с таким же сообщения дан и IP и потерпеть неудачу, если таковой существует

- otherwise-

<ол начать = "2">
  • Создать upvote
  • Найти пост ассоциировать upvote с и связать их.
  • Наконец, повторно отправьте сообщение, чтобы включить перенаправленную связь.
  • Я чувствую, что последние два шага могут быть объединены, однако, если я просто верну пост после того, как связал надпись с ним, он не включается, что имеет смысл, потому что, когда оно было обнаружено, у него не было связанной связи. Вот что я сейчас имею, и я чувствую, что это очень неэффективно для одного 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'); 
         }); 
        }); 
    }); 
    
    +1

    Только один обещающий наконечник, Вам не нужно вводить '.error' после всего. Вы можете «вернуть» обещания, а затем обработать 'error' только в конце, так как у вас есть такая же функция –

    +0

    @MeghParikh у вас есть небольшой пример этого? Я как бы понимаю, что вы имеете в виду, но как я могу использовать 'res', если я объявляю общий ответ об ошибке за пределами маршрута? – Jordan

    +0

    см. Http://stackoverflow.com/questions/38080111/expressjs-promises-and-error-handling-middleware и в реестре, я использую 'catch' только один раз –

    ответ

    0

    Может быть полезно http://docs.sequelizejs.com/en/latest/docs/associations/#creating-with-associations.

    Но ИМХО вы можете объединить шаг 2 и 3 с:

    Upvote.create({ 
         ip: req.ip, 
         PostId: id 
        }) 
    

    , а затем принести новую должность

    +0

    Надеюсь, это поможет. Скажите, пожалуйста, если вам нужна дополнительная помощь и вы не можете понять –

    Смежные вопросы