如何使用节点js上的一对多关系表从mysql查询js创建json结果?

如何使用节点js上的一对多关系表从mysql查询js创建json结果?,mysql,node.js,express,postman,Mysql,Node.js,Express,Postman,我被SQL关系困住了。我已经搜索这个解决方案3-4个小时了,但进展甚微。我有两个表,我想在其中创建一对多关系,我想创建一个用户爱好API。 tb_用户 tb_skill id处的外键\u用户 +----------+--------------+---------------+--------------------+ | id_skill | id_user(FK) | skill | level | +----------+------------

我被SQL关系困住了。我已经搜索这个解决方案3-4个小时了,但进展甚微。我有两个表,我想在其中创建一对多关系,我想创建一个用户爱好API。

tb_用户 tb_skill id处的外键\u用户

+----------+--------------+---------------+--------------------+
| id_skill | id_user(FK)  | skill         | level              |
+----------+--------------+---------------+--------------------+
| 1        | 1            | Drawing       | Intermediate       |
| 2        | 1            | Coding        | Beginner           |
| 3        | 1            | Photoshop     | Intermediate       |
| 4        | 2            | Basketball    | Amateur            |
+----------+--------------+---------------+--------------------+
我想创建一个用户API,用JSON返回他们的姓名和技能。这是我的密码

app.get('/user',(req,res)=>{
  let sql1 = "SELECT * FROM tb_user";
  conn.query(sql1,(err,result1)=>{
    if (err) throw err;
    else{
      for(var i = 0;i<result1.length;i++){
        let sql2 = "SELECT skill,level FROM tb_skill WHERE tb_skill.id_user='"+result1[i].id_user+"'";
        conn.query(sql2,(err,result2)=>{
          if(err) throw err
          else{
            result1[i].skills=result2;
          }
        });
      }
      var data = {
        'status' : 200,
        'data' : result1
      };
      res.json(data);
      res.end;
    }
  });
});

您正在for循环中调用异步回调函数,这就是为什么您没有得到结果。有很多方法可以做到这一点,但我只是想帮助您修复代码。您可以尝试以下代码:

 app.get('/user',(req,res)=>{
   sql1 = "SELECT * FROM tb_user";
   conn.query(sql1,(err,result1)=>{
      if (err) throw err;
      else{
         for(var i = 0;i<result1.length;i++){

            ( (pos ) => {
               let sql2 = "SELECT skill,level FROM tb_skill WHERE tb_skill.id_user='"+result1[pos].id_user+"'";
                conn.query(sql2,(err,result2)=>{
                 if(err) throw err
                 else{
                    result1[pos].skills=result2;
                 }
               });
            } ) (i ); 
         }

        var data = {
          'status' : 200,
          'data' : result1
        };
        res.json(data);
      }
  }
})
app.get('/user',(req,res)=>{
sql1=“从tb\U用户中选择*;
conn.query(sql1,(err,result1)=>{
如果(错误)抛出错误;
否则{
对于(var i=0;i{
让sql2=“从tb_技能中选择技能,级别,其中tb_技能.id_用户=”+result1[pos].id_用户+”;
conn.query(sql2,(err,result2)=>{
如果(错误)抛出错误
否则{
结果1[pos]。技能=结果2;
}
});
})(i);
}
风险值数据={
“状态”:200,
“数据”:结果1
};
res.json(数据);
}
}
})
NB:使用,它将为您提供非常简单和准确的结果

{
  "status": 200,
  "data": [
    {
      "id_user": 1,
      "name": "Irsyad Abdul",
      "skills": [
        {
          "skill": "Drawing",
          "level": "Intermediate"
        },
        {
          "skill": "Coding",
          "level": "Beginner"
        },
        {
          "skill": "Photoshop",
          "level": "Intermediate"
        }
      ]
    },
    {
      "id_user": 2,
      "name": "Abdul Hamid",
      "skills": [
        {
          "skill": "Basketball",
          "level": "Amateur"
        }
      ]
    },
    {
      "id_user": 3,
      "name": "Darussalam",
      "skills": []
    }
  ]
}
 app.get('/user',(req,res)=>{
   sql1 = "SELECT * FROM tb_user";
   conn.query(sql1,(err,result1)=>{
      if (err) throw err;
      else{
         for(var i = 0;i<result1.length;i++){

            ( (pos ) => {
               let sql2 = "SELECT skill,level FROM tb_skill WHERE tb_skill.id_user='"+result1[pos].id_user+"'";
                conn.query(sql2,(err,result2)=>{
                 if(err) throw err
                 else{
                    result1[pos].skills=result2;
                 }
               });
            } ) (i ); 
         }

        var data = {
          'status' : 200,
          'data' : result1
        };
        res.json(data);
      }
  }
})