Thursday, 25 May 2017

Calling rest api inside Amaxon Lambda using Nodejs does not work as expected

I am calling rest api endpoint inside the lambda and based on the return value I generate different return object. The problem I face is when http.request() is called it does not fire the body, end or even error method.

below is my code for reference

var http = require('http');
function getJSON(options, callback){

    http.request(options, function(res){
        var body = "";
        console.log('calling the http');
        res.on('body', function(chunk){
            console.log('body' + chunk);
            body+=chunk;
        });
        res.on('end', function(){
            console.log('end event');    
            var result = JSON.parse(body);
            callback(null, result);
        })

        res.on('error', function(error){
            console.log('Error event');    
            callback('error', callback);
        })
    })
    .on('error', callback)
    .end();    
}

function getCityWeather(cityName, outputSessionAttributes){

    var options = {
        host: `api.openweathermap.org`,
        port: 80,
        path: `/data/2.5/weather?q=${cityName}&appid=api_key_here`,
        method: 'GET'
    };

    getJSON(options, function(err, result){
        if(err){
            console.log(err);
            return buildValidationResult(false, 'TodayWeatherCity', `Invalid city name. Please let me know the city again.`);
        }
        outputSessionAttributes.temprature = result.main.temp;
        console.log(outputSessionAttributes.temprature + ' value');
        return buildValidationResult(true, null, null);
    });

function getWeatherUpdate(intentRequest, callback) {
    const country = intentRequest.currentIntent.slots.TodayWeatherCountry;
    const city = intentRequest.currentIntent.slots.TodayWeatherCity;
    const source = intentRequest.invocationSource;
    const outputSessionAttributes = intentRequest.sessionAttributes || {};

    console.log("outputSessionArribute", intentRequest.sessionAttributes);

    if (source === 'DialogCodeHook') {
        const slots = intentRequest.currentIntent.slots;


        //without promiss implemeation
        var validationResult = getCityWeather(city, outputSessionAttributes);  
        if(!validationResult.isValid) {
            console.log('after calling getCityWeather with result');
            slots[`${validationResult.violatedSlot}`] = null;
            //if response not found then return the invalid city message
            callback(elicitSlot(intentRequest.sessionAttributes, intentRequest.currentIntent.name, slots, validationResult.violatedSlot, validationResult.message));
            return;
        }
        console.log('getWeatherUpdate after calling getCityWeather');
        callback(delegate(outputSessionAttributes, slots));
        return;
    }

    console.log('getWeatherUpdate after DialogCodeHook');
    if(outputSessionAttributes.temprature){

        console.log('getWeatherUpdate inside outputSessionAttributes.temprature return');
        //get the value from the session variable and prompt to user
        callback(close(outputSessionAttributes, 'Fulfilled', { contentType: 'PlainText',
        content: `Okay, temprature reading for ${city} is ${outputSessionAttributes.temprature}` }));
    }

    //get the value from the session variable and prompt to user
    callback(close(outputSessionAttributes, 'Fulfilled', { contentType: 'PlainText',
    content: `Sorry, I couldn't server your request` }));
}

When getCityWeather is called it calls getJSON. But once it calls getJSON only calling the http is printed and function returns error;



via Desmond

No comments:

Post a Comment