【发布时间】:2021-12-02 17:43:16
【问题描述】:
我有一个 Lambda POST 函数,它获取 http 请求 JSON 正文数据并将其添加到连接的 MySql 数据库。
代码如下:
var mysql = require("mysql");
var config = require("./config.json");
var pool = mysql.createPool({
host: config.dbhost,
user: config.dbuser,
password: config.dbpassword,
database: config.dbname,
port: 3306,
ssl: true,
});
exports.handler = (event, context, callback) => {
context.callbackWaitsForEmptyjsonLoop = false;
pool.getConnection(function (err, connection) {
const col1 = event.col1;
const col2 = event.col2;
const col3 = event.col3;
// Use the connection
connection.query(
"INSERT INTO table (col1, col2, col3) VALUES(?, ?, ?)",
[col1, col2, col3],
function (error, results, fields) {
// And done with the connection.
connection.release();
var response = {
statusCode: 200,
body: JSON.stringify("Account added successfully!"),
};
// Handle error after the release.
if (error) callback(error);
else callback(null, response.body);
}
);
});
};
我有一个非常相似的 lambda 函数,它从 JSON 更新数据库中的记录,并且运行完美。
测试代码时,记录已成功添加到数据库中。但是,无论我将超时限制设置多长时间,lambda 函数都会超时。
lambda 返回此错误:
{ "errorMessage": "2021-10-14T10:00:25.159Z 62f12d68-c648-4f0f-9e86-3cd23f0f90c6 Task timed out after 5.01 seconds" }
日志的最后两行是:
Thu Oct 14 10:00:25 UTC 2021 : Successfully completed execution
Thu Oct 14 10:00:25 UTC 2021 : Method completed with status: 200
我已将代码作为运行它的本地文件使用:node local.js 进行了测试,它运行迅速且没有错误。
不知道我错过了什么。 INSERT INTO 查询的返回类型可能与 UPDATE 不同?
任何帮助将不胜感激。谢谢
【问题讨论】:
-
您的 lambda 在 VPC 中吗?和mysql一样吗?
-
Lambda 是区域性的。 MySql 是天蓝色的云
-
context.callbackWaitsForEmptyEventLoop = false -
@hoangdv 你明白了,非常感谢。如果您愿意,可以发布作为答案,我会接受
-
我仍然想指出,在您的 lambda 函数中使用完整的连接池并不是很有用(而且最终会出现问题)。通常最好只打开一个连接并在每次执行处理程序函数时再次关闭它。这也可以防止您在这里遇到的问题。
标签: node.js amazon-web-services aws-lambda aws-api-gateway