#Sequelize findAll事件和forEach事件getUser

#Sequelize findAll events and forEach event getUser

本文关键字:事件 getUser forEach #Sequelize findAll      更新时间:2023-09-26

我在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 Object..我检查了user[0].dataValues的内容,这正是我想要的。所以我想我错过了一些东西,误解了一些承诺:/我尝试了很多事情,但主要是我的问题是:我怎么能从我的控制台。log

检索我的字符串

event.getUsers返回一个承诺-因此您正在分配events.dataValues.master(这是数组,而不是特定事件)的承诺,而不是值。

此外,在getUsers完成之前,您将返回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);});

当你在promise中返回一个promise给回调时。每次,在所有返回的承诺完成之前(即在所有getUsers调用完成之前),then(调用next)都不会被调用。我还更改了where子句,使用对象而不是字符串:)

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

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

左连接users表,其中关系为master。您可能想在then中做一个映射,因为用户将被放置在.users下,而不是.master