使用mysqljs通过存储过程查询mySQL数据库,用于express.js中的webAPI端点。我需要返回插入的对象。为此,我试图基于mysqljs的文档访问insrtedId。但是插入总是返回零。
我尝试在存储过程中包含输出参数,并将其设置为LAST_INSERT_ID()。insertedId仍然是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)开始
插入tbl1(name)值(_name);
集合_LID = LAST_INSERT_ID();
END`‘
注意,id被设置为自动增量。
发布于 2019-06-11 19:57:31
由于我只能使用存储过程,所以我选择了插入存储过程中添加的记录。这使得在调用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方法中,可以以“rows”的形式从行中作为对象访问添加的重新编码。不需要对数据库进行get调用
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]);
}
}
);
});发布于 2019-06-11 11:58:23
因为你用的是存储的程序。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
https://stackoverflow.com/questions/56511731
复制相似问题