Node.js Lambda函数完成,但对RDS的查询不完整

Node.js Lambda函数完成,但对RDS的查询不完整,node.js,amazon-web-services,aws-lambda,amazon-rds,Node.js,Amazon Web Services,Aws Lambda,Amazon Rds,我试图使用handler.async对数据库(RDS)进行后期查询。 然而,我遇到了以下问题 一半时间,lambda函数完成,但查询未成功发送到RDS。另一半时间,它将完全发送给lambda。尝试添加setTimeout函数以将lambda执行时间增加3秒,查询将一直发送 此外,日志将显示错误: 信息错误:致命错误后无法将查询排队 以下是我的代码: var mysql=require('mysql'); var connection=mysql.createConnection({ 主机:'*

我试图使用handler.async对数据库(RDS)进行后期查询。 然而,我遇到了以下问题

一半时间,lambda函数完成,但查询未成功发送到RDS。另一半时间,它将完全发送给lambda。尝试添加setTimeout函数以将lambda执行时间增加3秒,查询将一直发送

此外,日志将显示错误:

信息错误:致命错误后无法将查询排队

以下是我的代码:

var mysql=require('mysql'); var connection=mysql.createConnection({ 主机:'***', 用户:'***', 密码:'***', 数据库:'***' }); exports.handler=异步(事件)=>{ const sql=`插入表单值(777,2,3,4,5,6,7,8,9,10,11);`; 常量查询=(x)=>{ 返回新承诺((解决、拒绝)=>{ 解析(connection.query)(x,函数(错误,结果,字段){ console.log(错误) console.log(结果) console.log(字段) }))})} 等待查询(sql)
}您可以将lambda超时增加到15分钟。但是,如果您通过api网关调用lambda,则超时时间为29秒

这是为我工作的代码

const mysql = require('mysql');
const con = mysql.createConnection({
  host: process.env.RDS_HOSTNAME,
  user: process.env.RDS_USERNAME,
  password: process.env.RDS_PASSWORD,
  port: process.env.RDS_PORT,
  connectionLimit: 10,
  multipleStatements: true,// Prevent nested sql statements
  debug: true
  // ,database:'testdb1'
});


exports.handler = async (event) => {
  try {
    const data = await new Promise((resolve, reject) => {
      con.connect(function (err) {
        if (err) {
          reject(err);
        }
        const sql = `INSERT INTO forms VALUES(777,2,3,4,5,6,7,8,9,10,11);`;
        con.query(sql, function (err, result) {
          if (err) {
            console.log("Error->" + err);
            reject(err);
          }
          resolve(result);
        });
      })
    });

    return {
      statusCode: 200,
      body: JSON.stringify(data)
    }

  } catch (err) {
    return {
      statusCode: 400,
      body: err.message
    }
  }
};

参考资料:

在任何环境中管理RDBMS连接都不是一项简单的任务。Lambda在这里增加了一层复杂性。您需要了解热重启和冷重启之间的区别,它对在处理程序函数之外创建的资源意味着什么,连接池何时合适,以及何时和如何释放连接

到数据库的持久连接并不特别适合于微服务、FaaS环境(如Lambda)。这就是Aurora Serverless支持an的原因之一(希望其他DB引擎也会支持)

阅读

也要注意新情况


在您的特定情况下,最明显的问题是您重复创建DB连接,但从未释放它们(除非这是mysql包的
query
函数的内置功能,我不知道)。

我看到您的代码存在的主要问题是,您没有正确地解决承诺,它应该是
connection.query(x,function(error,results,fields){resolve()})
,而是将查询函数作为参数传递给resolve函数。我不明白为什么。我想那是因为你没有释放连接。在查询完成后尝试执行connection.release()。也可以在confighi arunk中配置池。我设法使它工作起来。非常感谢。只是一个简单的新手问题,就是尝试。。用于调试的捕获。我可以把它们取下来,或者最好把它们放在适当的位置。试着抓住是很重要的。首先,它将帮助您从api返回关于异常的友好消息。如果没有try-catch,应用程序将从api发送完全丑陋的错误。其次,try-catch是承诺拒绝的必要条件,如果承诺拒绝在未来版本的nodehp中没有在应用程序内部处理,nodejs进程将终止。请帮助任何人?@如果提供的回答中有一个帮助回答了您的问题,那么请选择它作为答案。如果没有,那么请考虑写一个答案并选择它。