2016-06-25 2 views
1

нужно вызвать 3 участника апи из внутреннего интерфейса в NodeJS и вернуть данные в Ajax вызова в интерфейсеNodeJS - Третья сторона Api звонок от app.js

Ниже мой код:

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 я могу получить параметр city_name из запроса ajax post от сторонней стороны, однако я получаю 500 ошибок внутреннего сервера каждый раз, когда я выполняю запрос на отправку

PS: Простите мой английский и даже уровень вопроса, поскольку я являюсь абсолютным новичком в NodeJS

+0

является путь/get_data определяется? – Kingalione

ответ

1

Вы возвращаете ответ извне вызова функции, который получает данные от стороннего api. Вам нужно вернуть ответ от раздела res.on('end'. Это связано с тем, что вызов api является асинхронным, и нам нужно ждать ответа.

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

Полный код

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

Он отлично работал. Спасибо! –

+0

привет @ Zohaib Ijaz может дать мне ответ на мой вопрос ... мои вопросы, когда я ударил стороннего api, тогда его не отправили ответ, как err или данные. Как я могу справиться с этими ситуациями в моих приложениях js узла. – Yash

0

Ну делая простой 'GET' с Почтальон в api.openweathermap.org/data/2.5/forecast/daily?q=Miami&mode=json&units=metric&cnt=14&appid=75e843de569fb57a783c2e73fd9a7bb5 ли возвращать результаты.

Так что, похоже, как вы можете упустить что-то вроде var http = require('http'); возможно :)

0

Я настоятельно рекомендую использовать request модуль в npm, делает запросы способ проще в обращении. См. this.

Во-первых: maybe здесь не нужно. Вы получаете строку JSON из API, затем вы анализируете ее в объекте, но когда вы ее отправляете, вам нужно еще раз ее подстроить. Так что просто придерживайтесь входящих данных в строковой форме.

Во-вторых: response.send называется вне end события: так, что происходит в том, что - JavaScript является асинхронным - он будет вызывать API, но не ждать ответа, чтобы вернуться, потому что вы сами уже посылает ответ вашему клиенту. Вы должны поместить это в обратный вызов end, чтобы фактически ожидать API.

Так это то, что я хотел бы сделать:

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

Почему бы не использовать axios на стороне сервера? – kurumkan

Смежные вопросы