我有一个AWS网关方法,代理通过AWS请求。但是,在日志中有以下内容,在三秒钟后就会出错:
转换前的端点响应体:{"errorMessage":"2017-09-05T16:30:49.987Z 922186c0-9257-11e7-9db3-51921d5597a2任务在3.00秒后超时“}
因此,我继续检查我的Node 6.10 AWS Lambda函数,以了解为什么它会超时。我在每个函数调用之前和之后都添加了日志语句。令人惊讶的是,它做了它应该做的一切:调用API回调,然后对数据库运行一个查询。这需要0.6s,据我所知,已经没有其他代码可以运行了。尽管如此,它似乎继续运行在其余的三秒钟,然后超时。(我想,这是因为我要打开到数据库的连接。)
我在callback调用之前和之后放置的日志语句表明,该调用在半秒内执行。然而,该响应似乎没有到达after,而在3秒后出现错误。
造成这种情况的潜在原因是什么,以及如何调试它?
发布于 2017-09-05 19:51:06
默认情况下,在callback()函数中调用NodeJS函数不会结束函数的执行。它将继续运行,直到事件循环为空。当您坚持打开数据库连接时,NodeJS Lambda函数在调用callback之后继续运行,这是一个常见的问题。您还没有发布任何代码,所以我不能给出具体的建议,但是您需要确定是否在代码中打开数据库连接或类似的内容。
或者,您可以更改行为,以便在调用callback函数时通过在context对象上设置callbackWaitsForEmptyEventLoop = false来结束执行。
发布于 2018-01-04 06:39:28
您的API网关有29秒的固定超时时间。大多数查询都是在这个时间段内完成的。将您的lambda执行超时时间增加到30 Sec到3 Min 00 Sec之间的任意位置。使用context.succeed()代替回调。这对我有用。
const mysql = require('mysql');
const connection = mysql.createConnection({
host : 'your_mysql_host',
user : 'your_mysql_user',
password : 'your_mysql_password',
database : 'your_mysql_db'
});
exports.handler = (event, context) => {
var userId = event.params.querystring.userid;
const sql = 'SELECT * FROM users where USER_ID=' + userId;
var response = {
"statusCode": 200,
"body": "body_text_goes_here"
}
if(userId){
connection.query(sql, function (error, results, fields) {
if (error) {
context.succeed(error);
} else {
response.body = results;
context.succeed(response);
}
});
}
}发布于 2019-08-05 18:57:22
我也有同样的问题,我已经更新了我的代码中的超时,但是没有运气,最终增加了lambda的执行时间,从而解决了我的问题。
https://stackoverflow.com/questions/46061612
复制相似问题