从代码底部的 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,你应该利用它的特性。尝试为用户和兴趣定义模型,建立关联并使用JOIN / 急切加载一次性加载用户和兴趣
更新:一个使用承诺的例子
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;
}
});
});
});