2013-09-05 38 views
3

标题听起来很复杂。我有一个用户表,每个用户可以有多个兴趣。这些兴趣通过查找表链接到用户。在PHP中,我查询用户表,然后为每个人做了一个查询来寻找兴趣。我怎么能在Node.js/Sequelize中做到这一点?我怎样才能设立某种承诺呢?例如:Node.js多个Sequelize原始sql查询子查询

sequelize.query("SELECT * FROM users").success(function(users) { 
    for (var u in users) { 
     sequelize.query("SELECT interests.id, interests.title FROM interests, user_interests WHERE interests.id = user_interests.interest_id AND user_interests.user_id = " + users[u].id).success(function(interests) { 
     if (interests.length > 0) { 
     users[u].interests = interests; 
     } 
    }); 
} 
return users; 

});

回答

7

从代码底部的return语句看来,您似乎还没有完全掌握node.js的异步本质。代码中的return语句将在第一次调用sequelize.query(即查询返回之前)后直接执行。这意味着用户将是未定义的。

如果你想真正“回归”的用户和他们的利益,我建议是这样的:

sequelize.query("SELECT * FROM users").success(function(users) { 
    done = _.after(users.length, function() { 
     callback(users) 
    }) 

    for (var u in users) { 
     sequelize.query("SELECT interests.id, interests.title FROM interests, user_interests WHERE interests.id = user_interests.interest_id AND user_interests.user_id = " + users[u].id).success(function(interests) { 
      if (interests.length > 0) { 
      users[u].interests = interests; 
      } 
      done(); 
     }); 
    } 
}); 

在上面_代码指的是实用库。该函数在调用users.length次之后执行回调函数。回调是一个传递给你的代码片段的函数,它应该处理返回的结果,例如在Web服务器上下文中将用户返回给客户端。

另一个评论 - 如果你只是在做原始SQL查询,Sequelize可能不是你的最佳选择。你为什么不直接使用SQL驱动程序的原因?如果你想使用sequelize,你应该利用它的功能。尝试将定义用户和兴趣的模型,建立一个协会,并使用JOINs/eager loading

更新加载用户和利益一气呵成:的使用承诺

sequelize.query("SELECT * FROM users").then(function(users) { 
    return sequelize.Promise.map(users, function (u) { 
    return sequelize.query("SELECT interests.id, interests.title FROM interests, user_interests WHERE interests.id = user_interests.interest_id AND user_interests.user_id = " + users[u].id).then(function(interests) { 
     if (interests.length > 0) { 
     user.interests = interests; 
     } 
    }); 
    }); 
}); 
+0

例如只要记住,你必须包括[下划线](https://npmjs.org/package/underscore)模块 – josemando

+2

_已被用于续集,并通过'Sequelize.Utils._'公开 –

+0

嗨Jan 我在同一个问题上被阻止了很多个小时。我尝试使用Promise.all没有任何运气。我是新来的node.js和所有异步的东西,所以我很困惑,但我想知道你是否有一个使用Promise.all的工作示例?谢谢 在任何情况下,你的答案工作,并帮助我很多。 – Etienne