从云功能插入扳手时发生会话泄漏

时间:2019-07-05 09:51:44

标签: google-cloud-platform google-cloud-functions google-cloud-spanner

我正在尝试使用后请求通过云功能将数据插入到扳手中。我认为我正在按照文档中的说明进行所有操作,但我不明白是什么原因导致下一个错误:

"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 个答案:

答案 0 :(得分:2)

您的代码似乎正确。正如@Mayeru在对问题的评论中指出的那样,首先要确认的是,您要插入一条新记录,该记录具有为表的primary key列指定的唯一值。

另一个可能导致您遇到的问题的可能性是,您正在尝试使用Cloud Console的“ Cloud Functions”>“ Function details”部分的“ Testing” UI来测试该功能。如果是这样,那么当您单击“测试功能”按钮时,您可能使用的是空的请求正文或格式错误的请求正文。在“测试功能”按钮上方显示的“触发事件”文本区域中,确保输入了有效的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();
    }
  });
};