Утечка сеанса на вставке гаечного ключа из облачной функции - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь вставить данные в гаечный ключ через облачную функцию, используя пост-запрос. Мне кажется, что я делаю все, как описано в документации, и я просто не могу понять, что вызывает следующую ошибку:

"Error: 1 session leak(s) detected. at _requests.onIdle.then (/srv/node_modules/@google-cloud/spanner/build/src/session-pool.js:193:25) at <anonymous>"

А есть моя облачная функция

const {Spanner} = require('@google-cloud/spanner');

module.exports.http = (req, res) => {
  const projectId = 'project-id';
  const instanceId = 'instance-id';
  const databaseId = 'database-id';

  const spanner = new Spanner({
    projectId: projectId,
  });

  const instance = spanner.instance(instanceId);
  const database = instance.database(databaseId);

  let sqlResponse = "";

  database.runTransaction(async (err, transaction) => {
    if (err) {
      res.status(500).send(JSON.stringify({message: err, requestBody: req.body}));
      return;
    }
    try {
      const data = req.body;
      const [rowCount] = await transaction.runUpdate({
        sql:
          'INSERT Feedbacks (age, comment, gender, rating) VALUES (@age, @comment, @gender, @rating)', 
        params: {
          age: data.age.toString(),
          comment: data.comment,
          gender: data.gender,
          rating: data.rating.toString(),
        },
      });
      sqlResponse = 'Successfully inserted ' + rowCount + ' record into the Feedbacks table.';
      await transaction.commit();
      res.status(200).send(JSON.stringify({message: sqlResponse, requestBody: req.body}));
    } catch (err) {
      res.status(500).send(JSON.stringify({message: err, requestBody: req.body}));
    } finally {
      database.close();
    }
  });

};

1 Ответ

2 голосов
/ 09 июля 2019

Ваш код кажется правильным.Как отметил @Mayeru в комментариях к вашему вопросу, первое, что нужно подтвердить, это то, что вы вставляете новую запись с уникальным значением, указанным для столбца, который является первичным ключом вашей таблицы столбца.

Другая возможность, которая может быть причиной проблемы, с которой вы столкнулись, заключается в том, что вы пытаетесь протестировать функцию с помощью пользовательского интерфейса «Тестирование» в облачных функциях Cloud Console> раздел «Сведения о функции».Если это так, то вы можете использовать пустое тело запроса или искаженное тело запроса, когда нажимаете кнопку «Проверить функцию».В текстовой области «Инициирующее событие», которая появляется над кнопкой «Проверить функцию», убедитесь, что вы ввели действительное тело запроса JSON, которое включает в себя элементы и значения, ожидаемые вашим оператором INSERT.

Например, должно работать тело запроса JSON «Инициирующее событие», подобное следующему:

{"singerId":"1001","firstName":"Test","lastName":"Singer"}

Использование следующей функции «nodeInsert», которая похожа на код, которым вы поделились:

const {Spanner} = require('@google-cloud/spanner');

module.exports.nodeInsert = (req, res) => {

  const projectId = 'my-project';
  const instanceId = 'my-instance';
  const databaseId = 'my-database';

  const spanner = new Spanner({
    projectId: projectId,
  });

  const instance = spanner.instance(instanceId);
  const database = instance.database(databaseId);

  let sqlResponse = "";

  database.runTransaction(async (err, transaction) => {
    if (err) {
      res
        .status(500)
        .send(JSON.stringify({message: err, requestBody: req.body}));
      transaction.end();
      console.error('Transaction terminated.');
      return;
    }
    try {
      const data = req.body;
      const parsedSingerId = parseInt(data.singerId, 10);
      const [rowCount] = await transaction.runUpdate({
        sql:
          'INSERT Singers (SingerId, FirstName, LastName) VALUES (@singerId, @firstName, @lastName)', 
        params: {
          singerId: parsedSingerId,
          firstName: data.firstName,
          lastName: data.lastName,
        },
      });
      sqlResponse = 'Successfully inserted ' + rowCount + ' record into the Singers table.';
      await transaction.commit();
      res
        .status(200)
        .send(JSON.stringify({message: sqlResponse, requestBody: req.body}));
    } catch (err) {
      res
        .status(500)
        .send(JSON.stringify({message: err, requestBody: req.body}));
      transaction.end();
      console.error('Transaction terminated.');
    } finally {
      database.close();
    }
  });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...