首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用mysqljs和存储过程投递后返回0的insertId

使用mysqljs和存储过程投递后返回0的insertId
EN

Stack Overflow用户
提问于 2019-06-09 03:22:36
回答 2查看 673关注 0票数 1

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

我尝试在存储过程中包含输出参数,并将其设置为LAST_INSERT_ID()。insertedId仍然是0

代码语言:javascript
复制
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)

开始

插入tbl1(name)值(_name);

集合_LID = LAST_INSERT_ID();

END`‘

注意,id被设置为自动增量。

代码语言:javascript
复制
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-11 19:57:31

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

代码语言:javascript
复制
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方法中,可以以“rows”的形式从行中作为对象访问添加的重新编码。不需要对数据库进行get调用

代码语言:javascript
复制
   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]);
      }
    }
  );
});
票数 2
EN

Stack Overflow用户

发布于 2019-06-11 11:58:23

因为你用的是存储的程序。mysqljs模块的insertId功能不可用。通过查询的设计,您基本上已经将该任务卸载到存储过程中,这就是您在返回的rows元素中看到预期结果而不需要额外范围的原因。

虽然这种方法没有什么问题,但是对于这样一个简单的查询使用存储的proc可能会使事情变得复杂,它限制了与直接的INSERT查询相比,您可以使用哪些模块特性。

考虑一下insertId特性可供您使用的替代方案:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56511731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档