使用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
答案 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
。您可以在此处进一步阅读该主题: