Javascript Node.js多个Sequelize原始sql查询子查询
标题听起来很复杂。我有一个用户表,每个用户可以有多个兴趣。这些兴趣通过查找表链接到用户。在PHP中,我查询了users表,然后对每个表进行查询以查找兴趣。如何在Node.js/Sequelize中执行此操作?我怎样才能做出某种承诺呢?例如:Javascript Node.js多个Sequelize原始sql查询子查询,javascript,node.js,sequelize.js,Javascript,Node.js,Sequelize.js,标题听起来很复杂。我有一个用户表,每个用户可以有多个兴趣。这些兴趣通过查找表链接到用户。在PHP中,我查询了users表,然后对每个表进行查询以查找兴趣。如何在Node.js/Sequelize中执行此操作?我怎样才能做出某种承诺呢?例如: sequelize.query("SELECT * FROM users").success(function(users) { for (var u in users) { sequelize.query(&quo
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;
});
从代码底部的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();
});
}
});
在上面的代码中,指的是一个实用程序库。在调用回调函数后执行回调函数的。回调是一个传递给代码段的函数,应该处理返回结果,例如在Web服务器的上下文中将用户返回到客户端
另一条评论——如果您只执行原始SQL查询,Sequelize可能不是您的最佳选择。为什么不直接使用SQL驱动程序?如果你想使用sequelize,你应该充分利用它的特性。尝试为用户和兴趣定义一个模型,使用
更新:使用承诺的示例
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;
}
});
});
});
请记住,您必须包括sequelize中已经使用的模块,并通过sequelize.Utils公开。嗨,Jan我在同一问题上被阻止了好几个小时。我试着用诺言,但没有任何运气。我对node.js和所有异步的东西都不熟悉,所以我可能会感到困惑,但我想知道您是否有一个使用Promise.all的工作示例?无论如何,谢谢你的回答,对我帮助很大。@Etienne我添加了一个使用promises@Jan.“您为什么不直接使用SQL驱动程序?”请您解释一下SQL驱动程序。我使用sequelize连接postres和express,并且只执行原始查询/原始多个查询