使用 mysqljs 和存储过程发布后 insertId 返回 0
insertId returning 0 after posting with mysqljs and stored procedure
使用 mysqljs 通过 express.js 中 webAPI 端点的存储过程查询 mySQL 数据库。我需要 return 插入的对象。为此,我尝试根据 mysqljs 的文档访问 insrtedId。但 insertedid 始终 return 为零。
我试图在存储过程中包含输出参数并将其设置为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)
BEGIN
insert into tbl1(name) values (_name);
set _LID = LAST_INSERT_ID();
END```
note that the id is set to auto increment
因为您使用的是存储过程。 mysqljs 模块的 insertId
功能不可用。通过查询的设计,您实际上已经将该任务卸载到存储过程,这就是为什么您在返回的 rows
元素中看到预期结果而无需额外范围的原因。
虽然这种方法没有任何问题,但使用存储过程进行如此简单的查询可能会使事情变得过于复杂,并且与直接 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
。您可以在此处进一步阅读该主题:
由于我只需要使用存储过程,所以我在插入存储过程中选择了添加的记录。这使得该记录在调用 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]);
}
}
);
});
使用 mysqljs 通过 express.js 中 webAPI 端点的存储过程查询 mySQL 数据库。我需要 return 插入的对象。为此,我尝试根据 mysqljs 的文档访问 insrtedId。但 insertedid 始终 return 为零。
我试图在存储过程中包含输出参数并将其设置为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)
BEGIN
insert into tbl1(name) values (_name);
set _LID = LAST_INSERT_ID();
END```
note that the id is set to auto increment
因为您使用的是存储过程。 mysqljs 模块的 insertId
功能不可用。通过查询的设计,您实际上已经将该任务卸载到存储过程,这就是为什么您在返回的 rows
元素中看到预期结果而无需额外范围的原因。
虽然这种方法没有任何问题,但使用存储过程进行如此简单的查询可能会使事情变得过于复杂,并且与直接 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
。您可以在此处进一步阅读该主题:
由于我只需要使用存储过程,所以我在插入存储过程中选择了添加的记录。这使得该记录在调用 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]);
}
}
);
});