DEV Community

Scott Lepper
Scott Lepper

Posted on

Http Request with AWS Lambda, Node.js 8.10, and Standard http library

In my previous article I showed an approach to extend a "traditional" (monolithic architecture) app using AWS Lambda: https://dev.to/scottlepp/extending-traditional-software-with-serverless-microservices-442m

Let's take a closer look at the Lambda function and how to make an http request using Node.js 8.10 and the standard http library.

In previous versions of node.js, the handler function contained a callback argument like so:

exports.handler = function (event, context, callback) {
Enter fullscreen mode Exit fullscreen mode

And when your http request finished you would execute the callback to indicate the function was finished:

const req = http.request(options, (res) => {
   callback('Success');
});
Enter fullscreen mode Exit fullscreen mode

And yet even older version of node.js didn't have a callback function, instead you would use "context.succeed" like so:

const req = http.request(options, (res) => {
   context.succeed();
});
Enter fullscreen mode Exit fullscreen mode

However, in node.js 8.10 this has changed. The callback argument is again not needed. Now you just wrap your function returning a Promise. Then instead of executing the callback function, you execute the Promise resolve function (or reject function if it fails) as so:

const http = require('http');

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

    return new Promise((resolve, reject) => {
        const options = {
            host: 'ec2-18-191-89-162.us-east-2.compute.amazonaws.com',
            path: '/api/repos/r1639420d605/index?delta=true&clear=false',
            port: 8000,
            method: 'PUT'
        };

        const req = http.request(options, (res) => {
          resolve('Success');
        });

        req.on('error', (e) => {
          reject(e.message);
        });

        // send the request
        req.write('');
        req.end();
    });
};
Enter fullscreen mode Exit fullscreen mode

That's it! These changes between versions of node.js tripped me up a bit so I wanted to share the latest method. Hope this helps someone!

Top comments (8)

Collapse
 
jsiesquen profile image
Juan Siesquen • Edited

Hi Scott,

I'm using the request-promise library but when try insert within exports.handler this aren't work... this is part of code, your support please, I'm novice yet:

How can implement this requests into lambda function?.... in my local test this work!

Or maybe should reemplace the requet-promise reference per a simple "http.request"?? Opinions please?

Thanks very much for advance.....

Regards

Collapse
 
jsiesquen profile image
Juan Siesquen • Edited

Hi Guys,

Finally, as I not know much about "request-promise" module, use "request-promise-native" instead. I have this model...

You already have an array with the results and the code looks synchronous.

I hope that is model can use for others verbs like post and patch. I'm in testing yet. Will I do well?

Collapse
 
nicolasmorinpomerleau profile image
nicolasmorinpomerleau • Edited

In case of Lambda project, what urls we put in host and path parameters ?

Collapse
 
scottlepp profile image
Scott Lepper

In this case I was running Voyager Search on an ec2 instance. The host was the ec2 instance and the path was to a REST call that Voyager Search supports, but you could take this approach with any REST provider.

Collapse
 
liambarnettit profile image
Liam Barnett

Useful post - thanks!

Collapse
 
fcpauldiaz profile image
Pablo Díaz

Nice and clean!

Collapse
 
lucallero profile image
Luciano Callero

Helpful indeed, thanks!

Collapse
 
adamshechter9 profile image
Adam Shechter

Awesome!
thank you, this is exactly what I needed.