#Sequelize findAll events 和 forEach event getUser

#Sequelize findAll events and forEach event getUser

我在使用 Sequelize 和 promise(主要是 promise)时遇到了一些问题。 例子 : 我想要我所有的事件和这些事件的主人。我做过类似的事情:

 models.events.findAll().then(function(event) {
     events.forEach(function(event){
         events.dataValues.master = event.getUsers({
               where: ['UserRelationEvent.relation = "master"'],
               joinTableAttributes: []
         }).then(function(user){
               return user[0].dataValues;
         });
     });
     return next(events);
 }).catch(function(err) {next(err)});

但是我得到了一个 Sequelize 对象。我检查了 user[0].dataValues 的内容,这正是我想要的。所以我想我错过了一些东西并且误解了一些承诺:/ 我尝试了很多东西,但主要是我的问题是:如何从我的 console.log

中检索我的字符串

event.getUsers return 是一个承诺 - 所以你正在分配 events.dataValues.master (这是数组,而不是特定事件)承诺,而不是价值。

此外,在 getUsers 完成之前,您正在 returning next,因为它们发生异步

像这样的东西应该可以工作

models.events.findAll().then(function(events) {
     sequelize.Promise.each(events, function(event){
         return event.getUsers({
               through: {
                    where: { relation: 'master' }
               },
               joinTableAttributes: []
         }).then(function(user){
                event.dataValues.master = user[0];
         });
     }).then(function (events) {
        return next(events);
     });
}).catch(function(err) {next(err);});

当您 return 对 promise.each 中的回调作出承诺时,then(调用 next)不会在所有 [=35= 之前被调用]ed 承诺已完成(即在所有 getUsers 调用完成之前。 我还更改了 where 子句以使用对象而不是字符串 :)

但是等等!我们可以做得更好!

models.events.findAll({
    include: [
        {
            model: User,
            through: {
                where: {
                    relation: 'master'
                }
            }
        }
    ]
}).then(function(events) {
    return next(events);
}).catch(function(err) {next(err);});

这左加入关系为主的用户table。您可能想在 then 中做一个映射,因为用户将被放置在 .users 下,而不是 .master