insertId возвращает 0 после публикации с помощью mysqljs и хранимой процедуры - PullRequest
1 голос
/ 09 июня 2019

Использование mysqljs для запроса базы данных mySQL через хранимую процедуру для конечной точки webAPI в express.js.Я обязан вернуть вставленный объект.для этого я попытался получить доступ к insrtedId на основе документации mysqljs.но insertid всегда возвращает ноль.

Я попытался включить выходной параметр в хранимую процедуру и установить его в LAST_INSERT_ID ().Все еще вставлено: 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 ]

2 голосов
/ 11 июня 2019

Поскольку мне требуется работать только с хранимыми процедурами, я выбрал добавленную запись в хранимой процедуре вставки. Это делает эту запись доступной при вызове метода 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 доступ к добавленному записанному может быть получен как объект из строк как 'row [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]);
      }
    }
  );
});
0 голосов
/ 11 июня 2019

Потому что вы используете сохраненный процесс. insertId функция модуля mysqljs недоступна. Сконструировав свой запрос, вы по существу выгружали эту задачу в свою хранимую процедуру, поэтому вы видите ожидаемый результат в возвращенном элементе 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. Вы можете читать дальше по теме здесь:

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

...