5

标题听起来很复杂。我有一个用户表,每个用户可以有多个兴趣。这些兴趣通过查找表链接到用户。在 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;
});
4

1 回答 1

16

从代码底部的 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;
      }
    });
  });
});
于 2013-09-10T10:55:46.867 回答