Javascript Sequelize中的高效查询

Javascript Sequelize中的高效查询,javascript,node.js,express,sequelize.js,Javascript,Node.js,Express,Sequelize.js,我正在实施一个受IP限制的投票后系统。到目前为止,为完成以下步骤,单个帖子的投票路线总共包含4个查询: 查找已经存在的具有相同PostId和IP的upvote,如果存在则失败 -否则- 创建向上投票 找到要关联upvote的帖子并将其关联 最后,重新获取帖子以包含刚刚关联的upvote 我觉得最后两个步骤可以结合在一起,但是如果我只是在将upvote关联到它之后返回帖子,它就不会被包含,这是有意义的,因为当发现它没有关联upvote。这是我目前拥有的,我觉得单次投票效率很低 router.get

我正在实施一个受IP限制的投票后系统。到目前为止,为完成以下步骤,单个帖子的投票路线总共包含4个查询:

  • 查找已经存在的具有相同PostId和IP的upvote,如果存在则失败
  • -否则-

  • 创建向上投票
  • 找到要关联upvote的帖子并将其关联
  • 最后,重新获取帖子以包含刚刚关联的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');
            });
        });
    });
    
    可能会有帮助

    但依我看,您可以将第2步和第3步与:

        Upvote.create({
            ip: req.ip,
            PostId: id
        })
    
    然后获取新帖子

    可能会有所帮助

    但依我看,您可以将第2步和第3步与:

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

    然后获取新帖子

    只要一个提示,你不必在所有事情之后键入
    。error
    。您可以
    返回
    承诺,然后只在最后处理
    错误
    ,因为您有相同的承诺function@MeghParikh你有这个小例子吗?我有点明白你的意思,但是如果我在路由之外声明了一个一般错误响应,我怎么能使用
    res
    呢?请看,在注册路由中,我只使用
    catch
    一次仅一个承诺提示,你不必在所有操作之后键入
    。error
    。您可以
    返回
    承诺,然后只在最后处理
    错误
    ,因为您有相同的承诺function@MeghParikh你有这个小例子吗?我有点明白你的意思,但是如果我在路由之外声明了一般错误响应,我怎么能使用
    res
    呢?请参阅,在注册路由中,我只使用
    catch
    一次,希望这有帮助。如果你需要更多的帮助,但无法理解,请告诉我。希望这能有所帮助。如果你需要更多的帮助而不能理解,请告诉我