【问题标题】:Loop through query results and run another query for each result using QueryChainer遍历查询结果并使用 QueryChainer 为每个结果运行另一个查询
【发布时间】:2014-05-20 23:15:14
【问题描述】:

我在遍历结果集然后为每个结果运行另一个查询以附加一些额外数据时遇到问题。

我查看了 Sequelize.js 的 Github 问题,发现可以use QueryChainer to achieve this。但是,由于我仍然是这方面的新手,所以我无法弄清楚如何做到这一点。我的for 循环的执行是异步发生的,导致在没有额外数据的情况下发送响应。

这是我现在的做法:

// in blogs.js
var db = require('../models')

exports.findPosts = function(req, res) {

  if (req.User) {

    req.User.getPosts({
      include: [
        { model: db.User, attributes: ['displayName', 'profilePicture'] },
        { model: db.Game, attributes: ['name'] }
      ]
    }).success(function(posts) {

      console.log('Starting the loop...')

      for (var i in posts) {

        db.PostLikes.count({ where: { PostId: i.id } }).success(function(likes) {

          i.Likes = likes
          console.log('Fetched Likes for post #' + i.id)

        })

      }

      console.log('This should appear last!')
      res.json(posts)

    }).error(function(err) {

      console.log(err)
      res.send(404)

    })

  } else {
    res.send(404)
  }
}

上面的代码导致在没有Likes 属性附加到每个post 项的情况下发送响应。由于db.PostLikes.count() 调用的异步性质,console.logs 出现故障。

如果有人能告诉我一种使用 QueryChainer 来实现这一点的方法,那将非常有帮助。

【问题讨论】:

    标签: javascript database sequelize.js


    【解决方案1】:

    致寻求此问题解决方案的人:

    我在 SequelizeJS 的一位维护者的帮助下通过on Github 解决了这个问题。我的解决方案的一部分是为 Promises 使用“bluebird”库。可能可以使用不同的库,但我还没有用任何其他库测试我的代码。

    Here's a Gist of my code.我希望这可以帮助遇到这个问题的人:)

    【讨论】:

      猜你喜欢
      • 2011-10-21
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 2018-10-17
      • 1970-01-01
      相关资源
      最近更新 更多