NodeJS和MySQL中标记系统3表更新的最佳方法

时间:2016-08-14 03:26:10

标签: javascript mysql sql node.js

我正在撰写一个应用程序,让用户发布内容(称为"时刻")以及与该内容相关联的一个或多个标签。

我有一个3表数据模型(在MySQL中),如下所示:

  • 表:MOMENTS,列:MOMENT_ID,USER_ID,TITLE,CREATE_DATE
  • 表:标签,列:TAG_ID,TITLE,CREATE_DATE
  • 表:MOMENTS_TAGS,列:MOMENT_ID,TAG_ID

自动增量设置为:MOMENT_ID和TAG_ID

我尝试解决的问题(在NodeJS中)是:如何插入新帖子(在MOMENT表中)和1个或多个标签(在TAGS表中),获取各自的ID&# 39;并在连接表中进行第3次插入(MOMENT_TAGS)?

我已经尝试通过执行3次连续查询(首先是MOMENTS,然后是TAGS,然后是MOMENTS_TAGS)来解决此问题(使用mysqljs),但它失败了,因为尽管第一个result1.insertId返回正确的数字,但第二个结果2 .insertId似乎没有从TAGS表中返回正确的数字,而只是递增第一个result1.insertId。

到目前为止,这是我的代码(我首先尝试将其用于1个标记):

app.post('/api/post/complex', function(req,res) {

  pool.getConnection(function(err, connection) {

    var preppedQuery1 = "INSERT INTO MOMENTS (USER_ID, TITLE, CREATE_DATE) VALUES ('justatest@gmail.com','test moment title','2016-08-08')";
    connection.query(preppedQuery1, function(err1, result1) { 

      if (err1) {
        res.send('ERROR');  
        connection.release();
      } 
      else {

        var preppedQuery2 = "INSERT INTO TAGS (TITLE, CREATE_DATE,USER_ID) VALUES ('TEST TAG', '2016-09-08','justatest@gmail.com')";
        connection.query(preppedQuery1, function(err2, result2) {  

        if (err2) {
          res.send('ERROR');  
          connection.release();
        } 
        else {

          var preppedQuery3 = "INSERT INTO MOMENTS_TAGS (MOMENT_ID, TAG_ID) VALUES (" + result1.insertId + "," + result2.insertId + ")";
          //At this point if result.insertId is 100, result2.insertId is always 101 instead of coming from the TAGS table
          //Why isn't result2.insertId the auto-incremented number from the TAGS table insert?

connection.query(preppedQuery3, function(err3, result3) {  

            if (err3) {         
              res.send('ERROR');
              connection.release();  
            } 
            else {
              console.log(result3); //not really needed
              res.send('OK'); //everything worked
              connection.release();

            }

          });

        }

        });

      } 

    });

  });

});

2 个答案:

答案 0 :(得分:0)

看起来你正在运行preppedQuery1两次。 错字在这里: (假设这不仅仅是帖子中的拼写错误,而且实际上存在于你的来源......)

答案 1 :(得分:0)

已解决:第二个preppedQuery中的拼写错误(再次使用1,而不是2)。

正在分配测试的内容和正确的insertId。