【问题标题】:Why is AWS.Lambda.invoke `error` callback argument never populated?为什么从未填充 AWS.Lambda.invoke `error` 回调参数?
【发布时间】:2020-01-07 20:40:40
【问题描述】:

我正在尝试从外部 node.js 应用程序(即不在 AWS 上)调用 lambda 函数。 我使用了来自 AWS 文档的代码示例,它非常适用于名义案例。 但是,如果出现错误,我的调用函数永远不会正确处理它。

我的调用代码如下:

    // AWS.config before
    
    var pullParams = {
        FunctionName : 'myFunctionName',
        InvocationType : 'RequestResponse',
        LogType : 'None',
        Payload : JSON.stringify({
            "myParam" : params
        })
    };

    var lambda = new AWS.Lambda();

    lambda.invoke(pullParams, function(error, data) {
        console.log("error value: " + error);
        if (error) {
            console.log("Error invoking AWS " + error);
            // process error
        } else {
            // process payload
        }
     });

在我的 lambda 函数中,如果没有提供参数,我会引发错误并提供错误消息

exports.handler = (event, context, callback) => {

    var params = event.myParam;

    if (!params) {
        var error = new Error("Appropriate error message");
        callback(error);
        // In Node ≥8, could also be expressed making handler `async` and `throw`ing here
    }
    else {
        // do normal processing and create payload
        callback(null, "Payload");
    }
 }

但是,在invoke 回调中,error 始终为 null(即使 lambda 遍历错误代码路径),并且在遍历错误代码路径时,data 包含 errorMessage, errorType, stackTrace 键。

我在这里缺少什么? aws-sdkinvoke 绑定不应该填充error 而不是让我检查data.errorMessage 吗?!

【问题讨论】:

  • 我的问题是...err 是否仅在调用失败时设置,而不是在您返回错误响应时设置?这似乎是您所看到的行为。我还没有使用 javascript sdk 来调用 lambda 函数,所以我不确定它的意图。 The docs有些不清楚
  • 查看here 上的文档似乎支持从函数返回错误不会导致设置err 和错误状态代码的想法,并且您的错误提供将在有效负载中。
  • 确实如此;这不一定是做事的坏方法;但是link之类的代码示例是不正确的,因此我怀疑这种方法是错误的

标签: javascript node.js amazon-web-services lambda


【解决方案1】:

我可以使用解决方法,例如对收到的有效负载进行测试:

//如果(调用错误){

if (data.FunctionError){

这在技术上是可行的,但它与我发现的每个代码片段都不同。

【讨论】:

  • 这是我发现的。 data.FunctionError 存在于错误结果上,但错误对象为空。不太清楚该怎么做。
【解决方案2】:

您可以通过检查 data.Payload 中的错误消息来解决此问题

 var pullParams = {
    FunctionName : 'myFunctionName',
    InvocationType : 'RequestResponse',
    LogType : 'None',
    Payload : JSON.stringify({
        "myParam" : params
    })
};

var lambda = new AWS.Lambda();

lambda.invoke(pullParams, function(error, data) {
    console.log("error value: " + error);
    //data.Payload is returned as a string, to check it, turn into JSON object
    let payload = JSON.parse(data.Payload);
    if (error) {
        console.log("Error invoking AWS " + error);
        // process error
    } else {
        // process payload
        // check for Lambda error  
        if(!payload.errorMessage) {
             console.log(data.Payload);
        } else {
            //Lambda error
            console.log(payload.errorMessage);
        }
    }
 });

【讨论】:

    【解决方案3】:

    使用 context.fail() 而不是 callback(err) 来让处理程序失败

    【讨论】:

    • context.fail() 是旧的,已弃用的方法。 callback(err) 是新的推荐方法。
    • 并且使用 context.fail 会带来相同的结果。 InvocationError 始终为 null
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多