使用mysqljs和存储过程发布后,insertId返回0

时间:2019-06-09 03:22:36

标签: node.js express mysqljs

使用mysqljs通过存储过程查询mySQL数据库中express.js中的webAPI端点。我需要返回插入的对象。为此,我尝试根据mysqljs的文档访问insrtedId。但insertid始终返回零。

我试图在存储过程中包括输出参数,并将其设置为LAST_INSERT_ID()。仍然insertId为0

router.post("/", (req, res) => {
  name = req.body.name;
  apiconnection.query(
    `CALL userAdd ('${name}', @_LID)`,
    (error, rows, fields) => {
      if (error) {
        res.json({ message: `cant be saved to the database` });
      } else {
        const id = rows.insertId;
        router.get("/", (req, res) => {
          apiconnection.query(
            `select * from tbl1 where id = ${id}`,
            (error, rows, fields) => {
              if (!error) {
                res.json(rows);
              } else {
                res.json(error);
              }
            }
          );
        });
       }
    }
  );
});

here is the stored procedure 

```CREATE DEFINER=`root`@`localhost` PROCEDURE `userAdd`(IN _name varchar(250), OUT _LID int)
BEGIN
  insert into tbl1(name) values (_name);
  set _LID = LAST_INSERT_ID();
END```

note that the id is set to auto increment

2 个答案:

答案 0 :(得分:2)

由于我被要求只能使用存储过程,因此我在插入存储过程中选择了添加的记录。这样可以在调用POST方法时使该记录可用。

CREATE DEFINER=`root`@`localhost` PROCEDURE `userAdd`(IN _name varchar(250), OUT _LID int)
BEGIN
  insert into tbl1(name) values (_name);
  set _LID = LAST_INSERT_ID();
  select * from tbl1 where id = _LID;
END

然后在POST方法中,可以将添加的recored作为对象从行中作为'rows [0] [0]'访问。无需致电数据库

   router.post("/", (req, res) => {
  name = req.body.name;
  apiconnection.query(
    `CALL userAdd ('${name}', @_LID)`,
    (error, rows, fields) => {
      if (error) {
        res.json({ message: `cant be saved to the database` });
      } else {
        res.json(rows[0][0]);
      }
    }
  );
});

答案 1 :(得分:0)

因为您使用的是存储过程。 mysqljs模块的insertId功能不可用。通过查询的设计,您实际上已将该任务转移到存储过程中,这就是为什么您在返回的rows元素中看到所需结果的原因,而无需其他范围。

虽然这种方法没有什么问题,但是使用存储的proc进行这样的简单查询可能会使事情复杂化,并且与直接INSERT查询相比,它限制了您可以使用的模块功能。

考虑可以使用insertId功能的替代方法:

apiconnection.query('INSERT INTO tbl1 SET ?', {name: name}, function (error, results, fields) {
  if (error) throw error;
  console.log(results.insertId);
});

这还将使您能够访问results对象的其他元素,例如受影响的行或更改的行:

https://github.com/mysqljs/mysql#getting-the-number-of-affected-rows

关于无关的注释,请谨慎使用const id = …,以使生产者不断更改结果的函数中的定义方式如您所愿。 const创建的变量是不可变的。在这种情况下,您可以考虑使用let =var =,具体取决于您需要访问该数据的位置。似乎您只需要在下一个查询中使用它,因此我建议使用let。您可以在此处进一步阅读该主题:

http://2ality.com/2015/02/es6-scoping.html