标题听起来很复杂。我有一个用户表,每个用户可以有多个兴趣。这些兴趣通过查找表链接到用户。在PHP中,我查询了users表,然后为每个人做了查询以查找兴趣。我如何在Node.js / Sequelize中执行此操作?我怎样才能设定某种承诺呢?例如:
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;
});
答案 0 :(得分:13)
从代码底部的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;
}
});
});
});