kalisjoshua
kalisjoshua

Reputation: 2496

Does AWS Lambda (NodeJS) not allow http.request or https.request?

I am attempting to make a request to another API from a Lambda. I am finding that using the NodeJS http and https modules allow for GET requests but any others (e.g. POST) do not work; POST coincidentally is the only method I need to work for the service I am attempting to call.

Here is a working example of Lambda performing a GET and receiving a 200 response:

const https = require('https')

function handler(event, context, callback) {
    const options = {
        hostname: 'encrypted.google.com'
    }
    
    https
        .get(options, (res) => {
            console.log('statusCode:', res.statusCode);
        
            res.on('end', callback.bind(null, null))
        })
        .on('error', callback);
}

exports.handler = handler

So that proves that he request is allowed. However, if the script attempts to make the same request using the .request() method of the https (or https) lib/module the request never finishes and the Lambda times out.

const https = require('https')

function handler(event, context, callback) {
    const options = {
        hostname: 'encrypted.google.com',
        method: 'GET'
    }
    
    https
        .request(options, (res) => {
            console.log('statusCode:', res.statusCode);
        
            res.on('end', callback.bind(null, null))
        })
        .on('error', callback);
}

exports.handler = handler

I don't know what I am doing wrong. The call https.request() silently fails - doesn't throw an error - and nothing is reported in the log.

Upvotes: 2

Views: 4795

Answers (3)

kalisjoshua
kalisjoshua

Reputation: 2496

The problem was that I was never completing the request with req.end().

const https = require('https')

function handler(event, context, callback) {
    const options = {
        hostname: 'encrypted.google.com',
        method: 'GET'
    }
    
    https
      .request(options, (res) => {
          console.log('statusCode:', res.statusCode);

          res.on('end', callback.bind(null, null))
      })
      .on('error', callback)
      .end(); // <--- The important missing piece!
}

exports.handler = handler

Upvotes: 6

Vijayanath Viswanathan
Vijayanath Viswanathan

Reputation: 8541

Please try this one if your API is HTTPS,

var url = 'HTTPS URL HERE';

var req = https.get(url, (res) => {
    var body = "";

    res.on("data", (chunk) => {
        body += chunk
    });

    res.on("end", () => {
        var result = JSON.parse(body);

        callBack(result)
    });
}).on("error", (error) => {
    callBack(err);
});
}

And if it is HTTP then,

var url = 'HTTP URL HERE';

var req = http.get(url, (res) => {
    var body = "";

    res.on("data", (chunk) => {
        body += chunk
    });

    res.on("end", () => {
        var result = JSON.parse(body);

        callBack(result)
    });
}).on("error", (error) => {
    callBack(err);
});
}

Please don't fogot to add package require('https') / require('http')

Upvotes: 0

Uzair Hassan
Uzair Hassan

Reputation: 9

The POST method is done by the request method.

This is the lambda code:

const https = require('https');
    
const options = {
  hostname: 'Your host name',
  path: '/api/v1/Login/Login',
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body : JSON.stringify({
        'email': '[email protected]',
        'password': 'Asdf1234.',
  })
};

var result;
try{
    result = await https.request(options);
    console.log("result.....",result);
}catch(err){
    console.log("err......",err);
}

Upvotes: -1

Related Questions