2017-08-01 73 views
0

尝试:Sequelize查询()内

  1. 得到用户的
  2. 从用户的详细信息列表获得由用户
  3. 并且基于执行一些动作输出创建的车次

以下是我尝试运行的代码。

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吗?

回答

0

你应该通过使用console.log来调试这个例子。首先你应该尝试打印你的第一个回调结果,可能是数据库连接没有正确配置,可能是表空了。有很多原因。同时它更舒适地使用.forEach方法,而不是“for”循环

array.forEach((item, i, arr)=>{ 
    ///.... 
}) 
0

不要使用的异步方法和任何环路。最好使用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) 
+0

谢谢。我能够使用Promise.All解决这个问题。 – Shiva

0

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

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

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