AWS Lambda 中的节点函数超时
Node function in AWS Lamda timing out
我正在尝试调用在 SAM 本地环境中托管的 Node.JS 中编写的 lamda 函数。该函数正在连接到本地托管的 MySQL 数据库。
代码如下:
var mysql = require('mysql');
exports.handler = (event, context, callback) => {
let id = (event.pathParameters || {}).division || false;
var con = mysql.createConnection({
host: "host.docker.internal",
user: "root",
password: "root",
database: "squashprod"
});
switch(event.httpMethod){
case "GET":
con.connect(function(err) {
if (err) throw err;
con.query("SELECT * FROM players where division_id = 1",
function (err, result, fields) {
if (err) throw err;
//console.log(result);
return callback(null, {body: "This message does not work"});
}
);
});
// return callback(null, {body: "This message works"});
break;
default:
// Send HTTP 501: Not Implemented
console.log("Error: unsupported HTTP method (" + event.httpMethod + ")");
callback(null, { statusCode: 501 })
}
}
但是回调(带有消息"This message does not work")没有出现。我知道它正在调用数据库,因为 console.log 调用会打印结果。当此代码运行时,我在浏览器中收到内部服务器错误,并收到来自 SAM Local 的以下消息:
2018-09-13 20:46:18 Function 'TableGetTest' timed out after 3 seconds
2018-09-13 20:46:20 Function returned an invalid response (must include one of: body, headers or statusCode in the response object). Response received: b''
2018-09-13 20:46:20 127.0.0.1 - - [13/Sep/2018 20:46:20] "GET /TableGetTest/2 HTTP/1.1" 502 -
2018-09-13 20:46:20 127.0.0.1 - - [13/Sep/2018 20:46:20] "GET /favicon.ico HTTP/1.1" 403 -
如果我注释掉对 DB 的调用并只使用显示 "This message works" 的回调,则没有超时并且该消息会出现在浏览器中
我知道数据库代码很好,因为它可以独立运行。我感觉跟回调有关系,但是我对Node的了解还不够深
我正在拔我拔掉的头发。任何帮助将不胜感激!
我遇到了同样的问题,下面是我如何解决的。
第一个问题是冷启动时间不够
增加 lambda 的执行时间。初始连接设置将花费更长的时间。
此外,
您需要在完成查询后关闭连接。否则它不会保持节点的事件循环为空,这使得 lambda 假设它仍在工作中。
通过两种方式解决:
- 一切完成后立即关闭所有连接。
- 使用 Sequelize 而不是计划 mysql 库。 Sequelize 将有助于维护连接池并跨连接共享。
https://www.npmjs.com/package/sequelize
希望对您有所帮助。
我正在尝试调用在 SAM 本地环境中托管的 Node.JS 中编写的 lamda 函数。该函数正在连接到本地托管的 MySQL 数据库。
代码如下:
var mysql = require('mysql');
exports.handler = (event, context, callback) => {
let id = (event.pathParameters || {}).division || false;
var con = mysql.createConnection({
host: "host.docker.internal",
user: "root",
password: "root",
database: "squashprod"
});
switch(event.httpMethod){
case "GET":
con.connect(function(err) {
if (err) throw err;
con.query("SELECT * FROM players where division_id = 1",
function (err, result, fields) {
if (err) throw err;
//console.log(result);
return callback(null, {body: "This message does not work"});
}
);
});
// return callback(null, {body: "This message works"});
break;
default:
// Send HTTP 501: Not Implemented
console.log("Error: unsupported HTTP method (" + event.httpMethod + ")");
callback(null, { statusCode: 501 })
}
}
但是回调(带有消息"This message does not work")没有出现。我知道它正在调用数据库,因为 console.log 调用会打印结果。当此代码运行时,我在浏览器中收到内部服务器错误,并收到来自 SAM Local 的以下消息:
2018-09-13 20:46:18 Function 'TableGetTest' timed out after 3 seconds
2018-09-13 20:46:20 Function returned an invalid response (must include one of: body, headers or statusCode in the response object). Response received: b''
2018-09-13 20:46:20 127.0.0.1 - - [13/Sep/2018 20:46:20] "GET /TableGetTest/2 HTTP/1.1" 502 -
2018-09-13 20:46:20 127.0.0.1 - - [13/Sep/2018 20:46:20] "GET /favicon.ico HTTP/1.1" 403 -
如果我注释掉对 DB 的调用并只使用显示 "This message works" 的回调,则没有超时并且该消息会出现在浏览器中
我知道数据库代码很好,因为它可以独立运行。我感觉跟回调有关系,但是我对Node的了解还不够深
我正在拔我拔掉的头发。任何帮助将不胜感激!
我遇到了同样的问题,下面是我如何解决的。
第一个问题是冷启动时间不够
增加 lambda 的执行时间。初始连接设置将花费更长的时间。
此外,
您需要在完成查询后关闭连接。否则它不会保持节点的事件循环为空,这使得 lambda 假设它仍在工作中。
通过两种方式解决:
- 一切完成后立即关闭所有连接。
- 使用 Sequelize 而不是计划 mysql 库。 Sequelize 将有助于维护连接池并跨连接共享。
https://www.npmjs.com/package/sequelize
希望对您有所帮助。