当前位置: 首页 > 面试题库 >

为什么AWS Lambda功能总是超时?

白昊乾
2023-03-14
问题内容

我正在使用4.3版本的nodejs测试aws
lambda。我能够在控制台测试中成功完成我的处理程序函数中的所有语句,其中包括连接到vpc中的mongodb主机。但是,该功能总是超时。我发现了一些帖子和资源,讨论了使用回调,在上下文中设置属性以及IAM角色权限,但是无论我做什么,它总是会超时。当前代码:

'use strict';

var Mongoose = require('mongoose');
var Device = require('./device_model');
var Alarm = require('./alarm_model');
var Event = require('./event_model');

var mongoConnection = process.env.MONGO_URL;

var connection = Mongoose.connect(mongoConnection);

Mongoose.connection.once('open', function() {
    console.log("Connecting to mongo at: " + mongoConnection);
    console.log("Mongoose connection in lambda opened");
});

Mongoose.connection.on('error', function(){
    console.error("Error creating mongoose connection in lambda, exiting!");
    process.exit(1);
});

exports.check_alarms = function(event, context, callback) {

    context.callbackWaitsForEmtpyEventLoop = false;
    console.log("The incoming event: " + JSON.stringify(event));

    var device = null;
    Device.findByUUID(event.uuid, function(error, result){
        if(!error){
            device = result;
            console.log("the device: " + JSON.stringify(device));
            if(event.Ale && event.Ale.length > 0) {
                console.log("We have an alarm, checking if already set");
                callback(null, {"status":"alarms"});
            } else {
                console.log("Event contains no alarm; checking for historic active");
                callback(null, {"status":"no alarms"});
            }
        } else {
            console.log("there's a problem on mongo");
            callback("problem", "status not so good");
        }
    });

    callback(null, {"status":"outside of device find block"});
}

问题答案:

您有错别字:

context.callbackWaitsForEmtpyEventLoop = false;

应该:

context.callbackWaitsForEmptyEventLoop = false;

这是文档中有关
callbackWaitsForEmptyEventLoop 行为的内容:

callbackWaitsForEmptyEventLoop

默认值为true。此属性仅在修改回调的默认行为时有用。默认情况下,回调将等待,直到Node.js运行时事件循环为空,然后冻结进程并将结果返回给调用方。您可以将此属性设置为false,以要求AWS
Lambda在调用回调后立即冻结进程,即使事件循环中有事件也是如此。AWS
Lambda将冻结进程,Node.js事件循环中的任何状态数据和事件(事件循环中的所有剩余事件将在下次调用Lambda函数且AWS
Lambda选择使用冻结的过程时进行处理)。有关回调的更多信息,请参见使用回调参数。

最小示例:

// Times out due to typo
exports.function1 = (event, context, callback) => {
    setInterval(() => console.log('Long wait'), 100000);
    context.callbackWaitsForEmtpyEventLoop = false;
    callback(null, 'Hello from Lambda');
};

// Returns successfully
exports.function2 = (event, context, callback) => {
    setInterval(() => console.log('Long wait'), 100000);
    context.callbackWaitsForEmptyEventLoop = false;
    callback(null, 'Hello from Lambda');
};


 类似资料:
  • 问题内容: 我们经常看到如下: 有什么功能? 问题答案: DOCTYPE的最主要用途是在Quirks模式和Standards模式渲染之间切换浏览器。 出现此功能的原因是IE的旧版本中的“残破”渲染。人们认识到,如果Microsoft仅“修复”了IE呈现引擎,则许多现有站点将无法正确呈现。因此,它的工作方式是,如果您在页面中完全放置了_任何_有效的DOCTYPE声明,则假定您知道自己在做什么,并且浏

  • 我有以下2个类 然后运行 或 始终给予 为什么会出现这种情况?乍一看,在这两种场景中,我都假设只调用构造函数,因此唯一的输出是 但这显然是错误的。

  • 问题内容: 在此页面中,我找到了新的JavaScript函数类型: 我已经知道了什么,以及做的,但不知道什么是注定的。它是什么? 问题答案: 这是一个生成器功能。 生成器是可以退出并稍后重新输入的函数。它们的上下文(变量绑定)将在重新进入时保存。 调用生成器函数不会立即执行其主体。而是返回该函数的迭代器对象。调用迭代器的方法时,将执行生成器函数的主体,直到第一个表达式指定要从迭代器返回的值,或者使

  • 我正在尝试访问存储在我的Firebase存储中的文件,以便将它们的列表返回给我的APK。我做了一个云函数,它不工作,即使当一切似乎是正确的解决。 index.js images.js key.json 存储规则 执行函数输出为: 请问我在这里做错了什么?

  • 我已经彻底研究了所有的问题,但没有一个直接适用于我的问题。我正在循环访问用户ID数组并匹配它们以从我的firestore DB中获得一个用户。我会毫无问题地返回结果,但当我将其存储在状态数组中并运行控制台日志时,我的状态数组总是空的。第一个console.log工作并显示DB的结果。 请帮帮忙。

  • 问题内容: 我想编写一个代码,要求输入用户名,但时间限制为15秒。如果用户超过限制并且未能输入名称(或任何字符串),则代码将终止,并且将显示“超时”消息,否则应保存名称并显示“谢谢”消息。我曾经尝试过这种方法,但是这是错误的&无法正常工作。请给我一个解决方案。。谢谢。 问题答案: 该虚拟程序可能会帮助您: 更新: 这是经过测试的代码。 另外,我从man那里得到了一些提示。本手册已包含一个代码段,该