Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AWS Lambda NodeJs unable to return response

I am trying to implement a simple Node Js example on AWS Lambda,
The code has a sample example of Async library.
The code works fine, but from some reason the Lambda Function return null response.
I am new to Node as well, please help.

Following is the code -

var async = require('async');

exports.handler = async (event, context, callback) => {
    async.waterfall([
        function(callback) {
            console.log("ONE");
            callback(null, 1);
        },
        function(resp, callback) {
            console.log("TWO : ", resp);
            callback(null, 2);
        },
        function(resp, callback){
            console.log("THREE : ", resp);
            callback(null, "Done");
        }
    ],
    function(err, resp) {
        let response = {};
        if (err) {
            console.log("Error",err);
            response = {
                statusCode: 500,
                body: JSON.stringify('Error!'),
            };
            return response;
        } else {
            console.log("Success",resp);
            response = {
                statusCode: 200,
                body: JSON.stringify('Ok!'),
            };
            return response;
        }
    });
};

Following are the CloudWatch logs -

START RequestId: ab9aa426-dfc9-44ac-8d96-a4f102e30861 Version: $LATEST
2019-03-21T15:15:26.597Z    ab9aa426-dfc9-44ac-8d96-a4f102e30861    ONE
2019-03-21T15:15:26.597Z    ab9aa426-dfc9-44ac-8d96-a4f102e30861    TWO :  1
2019-03-21T15:15:26.597Z    ab9aa426-dfc9-44ac-8d96-a4f102e30861    THREE :  2
2019-03-21T15:15:26.597Z    ab9aa426-dfc9-44ac-8d96-a4f102e30861    Success Done
END RequestId: ab9aa426-dfc9-44ac-8d96-a4f102e30861
REPORT RequestId: ab9aa426-dfc9-44ac-8d96-a4f102e30861  Duration: 37.28 ms  Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 67 MB  

I used the sample Node blueprint, which works fine -

exports.handler = async (event) => {
    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};
like image 829
Ani Avatar asked Jan 01 '23 03:01

Ani


2 Answers

Since you're already using Node 8, you don't need to use the outdated, confusing callback approach anymore. Use await instead

exports.handler = async (event) => {
    try {
        await somePromise1 
        await somePromise2
        await somePromise3 
        console.log("Success", resp);
        response = {
            statusCode: 200,
            body: JSON.stringify('Ok!'),
        };
        return response;
    } catch (err) {
        console.log("Error", err);
        response = {
            statusCode: 500,
            body: JSON.stringify(err),
        };
        return response;
    }
};

where somePromise1, somePromise2 and somePromise3 are your promisified callbacks.

More on async/await here.

like image 92
Thales Minussi Avatar answered Jan 03 '23 15:01

Thales Minussi


Try to remove the async from the handler and use callback instead of return:

var async = require('async');

exports.handler = (event, context, callback) => {
    async.waterfall([
        function(callback) {
            console.log("ONE");
            callback(null, 1);
        },
        function(resp, callback) {
            console.log("TWO : ", resp);
            callback(null, 2);
        },
        function(resp, callback){
            console.log("THREE : ", resp);
            callback(null, "Done");
        }
    ],
    function(err, resp) {
        let response = {};
        if (err) {
            console.log("Error",err);
            callback(null, {
                statusCode: 500,
                body: 'Error!',
            });
        } else {
            console.log("Success",resp);
            callback(null, {
                statusCode: 200,
                body: 'Ok!',
            });
        }
    });
};
like image 33
ttulka Avatar answered Jan 03 '23 15:01

ttulka