然后在内部查询查询()

时间:2017-08-01 11:53:24

标签: node.js callback promise sequelize.js

尝试:

  1. 获取用户列表
  2. 从用户详细信息中获取用户创建的行程
  3. 并基于输出执行某些操作
  4. 以下是我试图运行的代码。

    models.user.findAll({})
        .then(function (users) {
            for (var i = 0; i < users.length; i++) {
                var userName = users[i].name;
                var userEmail = users[i].email;
    
                models.trip.findOne({ attributes: [ [userName, 'name'], [userEmail, 'email'], 'id' ], where: { userId: users[i].id } })
                    .then(function (trip) {
                        if (trip == null) {
                            //Send Emails
                        }
                    });
            }
        })
        .catch(function (error){ // enter code here
            console.log(">>>>>",error);
        });
    

    由于回叫,第二个Sequelize无法正常运行。

    您能否就如何解决此问题提出建议?它是否使用asyncawait / coyield?

3 个答案:

答案 0 :(得分:0)

您应该使用console.log进行调试。首先你应该尝试打印你的第一个回调结果,可能是数据库连接没有正确配置,可能是表是空的。原因很多。使用.forEach方法代替'for'循环

也更舒服
array.forEach((item, i, arr)=>{
    ///....
})

答案 1 :(得分:0)

不要在for和any循环中使用async方法。最好使用Promise.all或任何异步库。 代码就是这样。

var tasks = []
users.forEach(function (user) {
    tasks.push(models.trip({/*some attrs*/}).then(function (trip){
        if (trip) return Promise.resolve()
        return sendEmailPromise(user)
    }))
})
Promise.all(tasks).then(function() {
    //done
}).catch(errorHandler)

答案 2 :(得分:0)

如果模型有关联,那么您可以只包含其他模型并向其添加where子句。 Sequelize Docs

 User.hasMany(Trips, {foreignKey: 'userId'});

 User.findAll({
   include: {
     model: Trips,
     where: {userId: id}
   }
 });