2016-06-25 15 views
1

Ich brauche in NodeJS von Back-End-3rd-Party-API aufrufen und die Daten an Ajax-Aufruf in FrontendNodeJS - Third Party Api Anruf von app.js

Unten Rückkehr ist mein 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 Ich bin in der Lage, den city_name Parameter von Ajax Post Anfrage von Frontend-Seite, aber ich bekomme 500 internen Server Fehler jedes Mal, wenn ich die Post-Anfrage

PS: Entschuldigung mein Englisch und sogar das Niveau der Frage, wie ich bin ein absoluter Anfänger in NodeJS

+0

ist ein Weg/get_data definiert? – Kingalione

Antwort

1

Sie geben eine Antwort von außerhalb des Funktionsaufrufs zurück, die Daten von der API von Drittanbietern erhält. Sie müssen die Antwort von res.on('end' Abschnitt zurückgeben. Dies liegt daran, dass der api-Aufruf asynchron ist und wir auf die Antwort warten müssen.

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

komplette Code ist

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); 
    }); 

} 
}); 
+0

Es hat perfekt funktioniert. Vielen Dank! –

+0

hallo @Zohaib Ijaz kannst du mir die antwort meine frage geben ... meine fragen ist wenn ich die dritte api-apie dann schicke nicht die antwort wie err oder daten. Wie kann ich mit diesen Situationen in meinem Knoten js Anwendungen umgehen. – Yash

0

Nun, ein einfaches 'GET' mit Postman zu api.openweathermap.org/data/2.5/forecast/daily?q=Miami&mode=json&units=metric&cnt=14&appid=75e843de569fb57a783c2e73fd9a7bb5 Ergebnisse zurückkehrt zu tun.

So scheint es, wie Sie so etwas wie var http = require('http'); vielleicht fehlen möglicherweise :)

0

ich empfehlen, das request Modul in npm zu bedienen, einfachen Anfragen machen Weg zu handhaben. Siehe this.

Erstens: maybe ist hier nicht notwendig. Sie erhalten eine JSON Zeichenfolge von der API, dann parsen Sie sie in ein Objekt, aber wenn Sie es senden, müssen Sie es noch einmal stringifizieren. Bleiben Sie also einfach mit den eingehenden Daten in der String-Form.

Zweitens: response.send außerhalb des end Ereignis genannt: so was passiert ist, dass - JavaScript asynchron zu sein - es wird die API aufrufen, aber nicht für die Antwort kaum erwarten, wieder zu kommen, weil Sie sich schon sind das Senden einer Antwort zu Ihrem Kunden. Sie müssen das in den end Rückruf einfügen, um tatsächlich auf die API zu warten.

So ist es das, was ich tun würde:

router.post('/get_data', function(request, response){ 
var city_name = request.body.city_name; 
if(city_name in city_name_done){ 
    return; 
} 
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' 
    } 
    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'); 
      console.log(maybe.city); 
      response.send(body); 
     }); 
    }); 
    console.log('here too man'); 
    req.on('error', function(e) { 
     console.log('Problem with request: ' + e.message); 
    }); 
} 
}); 
+0

Warum nicht Axios auf der Serverseite verwenden? – kurumkan

Verwandte Themen