NodeJS - Third party Api call from app.js

17,054

You are returning response from outside of function call that gets data from 3rd party api. You need to return response from res.on('end' section. It is because api call is asynchronous and we have to wait for response to come.

res.on('end', function() {
     console.log('ended too');
     maybe = JSON.parse(body);
     console.log(maybe.city);
     response.send(maybe);
});

Complete code is

    router.post('/get_data', function(request, response){
var city_name = request.body.city_name;
if(city_name in city_name_done){

}
else {
    city_name_done.push(city_name);
    console.log('city_name: ' + city_name);
    var options = {
        host : 'api.openweathermap.org',
        path : '/data/2.5/forecast/daily?q=' + city_name + '&mode=json&units=metric&cnt=14&appid=75e843de569fb57a783c2e73fd9a7bb5',
        method : 'GET'
    }
    var maybe = '';
    console.log('till here')
    var req = http.request(options, function(res){
        var body = "";
        res.on('data', function(data) {
            console.log('data came');
            body += data;
        });
        res.on('end', function() {
            console.log('ended too');
            maybe = JSON.parse(body);
            console.log(maybe.city);
            response.send(maybe);
        });
    });
    console.log('here too man');
    req.on('error', function(e) {
        console.log('Problem with request: ' + e.message);
    });
    res.end();
}
});
Share:
17,054

Related videos on Youtube

Shlok Gandhi
Author by

Shlok Gandhi

I am sort of amateur coder and discovering myself here!

Updated on June 04, 2022

Comments

  • Shlok Gandhi
    Shlok Gandhi over 1 year

    I need to call 3rd party api from backend in NodeJS and return the data to ajax call in frontend

    Below is my code:

    router.post('/get_data', function(request, response){
    var city_name = request.body.city_name;
    if(city_name in city_name_done){
    
    }
    else {
        city_name_done.push(city_name);
        console.log('city_name: ' + city_name);
        var options = {
            host : 'api.openweathermap.org',
            path : '/data/2.5/forecast/daily?q=' + city_name + '&mode=json&units=metric&cnt=14&appid=75e843de569fb57a783c2e73fd9a7bb5',
            method : 'GET'
        }
        var maybe = '';
        console.log('till here')
        var req = http.request(options, function(res){
            var body = "";
            res.on('data', function(data) {
                console.log('data came');
                body += data;
            });
            res.on('end', function() {
                console.log('ended too');
                maybe = JSON.parse(body);
                console.log(maybe.city);
            });
        });
        console.log('here too man');
        req.on('error', function(e) {
            console.log('Problem with request: ' + e.message);
        });
        response.send(maybe);
    }
    });
    

    I am able to get the city_name parameter from ajax post request from frontend side however I get 500 internal server error everytime I execute the post request

    PS: Pardon my English and even the level of the question as I am an absolute beginner in NodeJS

    • Kingalione
      Kingalione over 7 years
      is a path /get_data defined?
  • kurumkan
    kurumkan over 6 years
    why not use axios on server side?
  • Yash
    Yash over 6 years
    hello @Zohaib Ijaz can u give me the answer my question ...my questions is when i hit the third party api then its not send the response like err or data . how can i handle this situations in my node js applications.