【问题标题】:AWS Lambda Node.js. mysql Error "Cannot enqueue Query after invoking quit" on second call onwards:AWS Lambda Node.js。 mysql 错误“调用退出后无法排队查询”在第二次调用之后:
【发布时间】:2021-12-13 03:39:14
【问题描述】:

我目前正在创建一个利用 Nodejs mysql 库的 AWS Lambda 解析器。现在,我的 lambda 能够在第一次调用期间执行对数据库的查询。但是,在随后的调用中,会出现错误“调用退出后无法使查询入队”。我知道这与与数据库的连接有关,但如果我没记错的话,“connection.query”应该与数据库建立隐式连接。我还在回调中调用了“connection.end”。有人可以帮我解决这个问题吗?

这是 Lambda index.js 代码:

/* Amplify Params - DO NOT EDIT
    API_SIMPLETWITTERCLONE_GRAPHQLAPIENDPOINTOUTPUT
    API_SIMPLETWITTERCLONE_GRAPHQLAPIIDOUTPUT
    API_SIMPLETWITTERCLONE_GRAPHQLAPIKEYOUTPUT
    AUTH_SIMPLETWITTERCLONEB1022521_USERPOOLID
    ENV
    REGION
Amplify Params - DO NOT EDIT */

const mysql = require("mysql");
// const util = require("util");
const config = require("./config.json");

const connection = mysql.createConnection({
  host: config.dbhost,
  user: config.dbuser,
  password: config.dbpassword,
  database: config.dbname,
});

// resolvers
const resolvers = {
  Query: {
    getAllUser: (event) => {
      return getAllUser();
    },
  },
};

function executeQuery(sql, params) {
  return new Promise((resolve, reject) => {
    const queryCallback = (error, results) => {
      if (error) {
        console.log("Error occured during query: " + error.message);
        connection.destroy();
        reject(error);
      } else {
        console.log("Connected to database and executed query");
        console.log("Results:", results);
        connection.end((err) => {
          if (err) {
            console.log("there was an error closing database:" + err.message);
          }
          console.log("database closed");
          resolve(results);
        });
      }
    };
    if (params) {
      connection.query(sql, [...params], (error, results) => {
        queryCallback(error, results);
      });
    } else {
      connection.query(sql, (error, results) => {
        queryCallback(error, results);
      });
    }
  });
}

async function getAllUser() {
  const sql = "SELECT * FROM User";
  try {
    const users = await executeQuery(sql);
    return users;
  } catch (error) {
    throw error;
  }
}

exports.handler = async (event) => {
  // TODO implement
  console.log("event", event);
  console.log('DB connection var', connection);
  const typeHandler = resolvers[event.typeName];
  if (typeHandler) {
    const resolver = typeHandler[event.fieldName];
    if (resolver) {
      try {
        return await resolver(event);
      } catch (error) {
        throw error;
      }
    }
  }
  throw new Error("Resolver not found");
};

【问题讨论】:

    标签: javascript mysql node.js amazon-web-services aws-lambda


    【解决方案1】:

    您正在结束您的连接第一次调用。因此,第二次调用不再具有该连接。

    如果您创建connection 对象在模块导入期间,请不要在您的调用中.end()

    如果您希望.end() connection 对象在调用期间,您必须在调用期间创建它 也是。

    【讨论】:

    • 对于第一点,我有点困惑,因为相同的连接变量仍然存在,根据我的理解,第二次调用中的 connection.query 将隐式建立一个新的数据库连接。
    • 您在第一次调用中实例化的连接对象已经结束。您无法重新连接。您可以做的是重新创建连接对象。类似问题:stackoverflow.com/questions/25072228/…
    • 澄清一下,创建connection 对象不同于建立数据库连接。 (令人困惑,我知道)。 createConnection 创建存储连接状态的对象。 .query() 建立实际的数据库连接。
    • 非常感谢,我现在明白为什么我的代码不起作用了。感谢您的详细解释!
    猜你喜欢
    • 2020-03-08
    • 2023-03-21
    • 1970-01-01
    • 2017-06-19
    • 2018-05-18
    • 1970-01-01
    • 2020-03-10
    • 2012-12-29
    • 1970-01-01
    相关资源
    最近更新 更多