我有一个运行在node.js 8.10上的AWS Lambda函数。此函数使用ioredis库连接到Redis服务器,并通过键获取值,然后返回该值。我在日志中看到连接成功,并且值已成功检索。但是,响应永远不会返回,如果我查看日志,我会看到lambda总是超时。
为什么这种情况持续发生?出于某种原因,lambda会继续运行而不是从Redis返回值吗?
这是我的lambda函数中的代码:
const Redis = require('ioredis');
const redis = new Redis(6379, 'http://redis.example.com');
exports.handler = async (event, context) => {
const value = await redis.get('mykey');
console.log('value', value); // this shows up in Cloudwatch logs
return value;
};
答案 0 :(得分:7)
简短的答案:只需设置event.callbackWaitsForEmptyEventLoop = false
。
exports.handler = async (event, context) => {
event.callbackWaitsForEmptyEventLoop = false;
...
};
为什么这很重要?
AWS Lambda中NodeJS运行时的默认行为是等待javascript事件循环为空,然后结束lambda的执行并返回值。您可以阅读有关AWS Lambda and the node.js event loop works here的更多信息。
因此,您的lambda函数当前正在发生的事情是,与Redis的连接使事件循环保持打开状态,从而阻止了函数成功结束执行。
答案 1 :(得分:2)
或者您可以关闭Redis连接。