为什么从未填充AWS.Lambda.invoke`error`回调参数?

时间:2017-03-08 12:57:46

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

我正在尝试从外部node.js应用程序调用lambda函数(即不在AWS上)。 我使用了来自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个密钥。

我在这里缺少什么? invoke的{​​{1}}绑定不应该填充aws-sdk而不是让我检查error吗?!

3 个答案:

答案 0 :(得分:2)

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

// if(invocationError){

if(data.FunctionError){< == null如果没有错误,"处理"如果返回错误

这在技术上有效,但它与我找到的每个代码片段不同。

答案 1 :(得分:0)

您可以通过检查数据来解决此问题。有效载荷中出现错误消息

 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);
        }
    }
 });

答案 2 :(得分:-1)

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