在AWS Lambda处理程序中使用回调

时间:2017-09-28 18:31:52

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

我一直在努力尝试输出我的承诺链的成功/错误。

我像这样链接承诺

exports.handler = function(event, context, callback) {
    Q.allSettled(init()).then(function (result) {

    requestValid(event.queryStringParameters)
        .then(isDuplicate)
        .then(process)
        .then(insertData)
        .then(displayResponse)
        .catch(function (error) {
            // Handle any error from all above steps
            console.error(
                'Error: ' + error
            );
            callback({
                statusCode: 500,
                body: JSON.stringify({
                    message: error
                }, null)
            });
        })
        .done(function () {
            console.log(
                'Script Finished'
            );
            callback(null, {
                statusCode: 200,
                body: JSON.stringify({
                    message: 'Done'
                })
            });
        });
    });
};

我在失败时呼叫Q.defer.reject(error_message);,在承诺内部成功Q.defer.resolve(success_message)。如果这些承诺中的任何一个失败,则会在.catch(function (error) {中捕获错误。

这一切都很好但是如何将这些数据返回给处理程序的回调?

我想做什么的例子,但不要因为承诺而如何/把它放在哪里......

exports.handler = function (event, context, callback) {
    let response = {
        statusCode: 200,
        body: JSON.stringify('some success or error')
    };

// Return all of this back to the caller (aws lambda)
    callback(null, response);
};

提前谢谢..

1 个答案:

答案 0 :(得分:0)

Chain your promises all the way you usually do it。将结果返回到链的最后一步。最后出现catch个错误,如果有错误则返回错误:

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

   RequestIsValid(event)
    .then(isDuplicate)
    .then(process)
    .then(insertData)
    .then(getResponse)
    .then(function(result) {
        //result would be the returning value of getResponse.
        callback(null, {
            statusCode: 200,
            body: JSON.stringify({
                message: 'Done',
                response: result
            })
        });
    })
    .catch(function (error) {
        // this will show on CloudWatch
        console.error(
            'Error: ' + error
        );
        // this will be the response for the client
        callback({
            statusCode: 500,
            body: JSON.stringify({
                message: error
            }, null)
        });
    })

// end of the function
}

假设isDuplicateprocessinsertDatagetResposne返回一个承诺,每个承诺的结果可以链接到下一个承诺。< / p>