Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js多个Sequelize原始sql查询子查询_Javascript_Node.js_Sequelize.js - Fatal编程技术网

Javascript Node.js多个Sequelize原始sql查询子查询

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

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

从代码底部的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,并且只执行原始查询/原始多个查询