Внешние вызовы API с Express, Node.JS и требуемый модуль

У меня есть маршрут следующим образом:

var express = require('express');
var router = express.Router();
var request = require('request');

router.get('/', function(req, res, next) {
  request({
    uri: 'http://www.giantbomb.com/api/search',
    qs: {
      api_key: '123456',
      query: 'World of Warcraft: Legion'
    },
    function(error, response, body) {
      if (!error && response.statusCode === 200) {
        console.log(body)
      }
    }
  });
});

module.exports = router;

Я пытаюсь вызвать API-интерфейс API-интерфейсов Giant Bomb API, чтобы вернуть все данные о World of Warcraft.

Проблема в том, что маршрут просто загружается; он ничего не делает или не уходит, это просто непрерывная загрузка.

Я не знаю, что я делаю неправильно, но это сказано... Я тоже не знаю, какое право. Я пытаюсь учиться, когда я иду.

Любая помощь будет большой.

Спасибо

Ответ 1

Вам нужно взять данные, полученные из request(), и отправить их обратно в ответ на запрос исходного веб-сервера. Он просто загружался, потому что вы никогда не отправляли какой-либо ответ на исходный запрос, поэтому браузер просто сидел там, ожидая ответа, чтобы вернуться, и, в конце концов, он отключится.

Так как request() поддерживает потоки, вы можете отправить обратно данные как ответ очень просто, используя .pipe() следующим образом:

var express = require('express');
var router = express.Router();
var request = require('request');

router.get('/', function(req, res, next) {
  request({
    uri: 'http://www.giantbomb.com/api/search',
    qs: {
      api_key: '123456',
      query: 'World of Warcraft: Legion'
    }
  }).pipe(res);
});

module.exports = router;

Это будет .pipe() результат request() в объект res, и он станет ответом на исходный запрос HTTP.

Связанный ответ здесь: Как прокси-запрос обратно в качестве ответа

Ответ 2

Для каждого маршрута в Express необходимо отправить ответ (частичный или полный) или вызвать next, либо сделать оба. Ваш обработчик маршрута не делает этого. Попробуйте

var express = require('express');
var router = express.Router();
var request = require('request');

router.get('/', function(req, res, next) {
  request({
    uri: 'http://www.giantbomb.com/api/search',
    qs: {
      api_key: '123456',
      query: 'World of Warcraft: Legion'
    },
    function(error, response, body) {
      if (!error && response.statusCode === 200) {
        console.log(body);
        res.json(body);
      } else {
        res.json(error);
      }
    }
  });
});

module.exports = router;

и посмотреть, какие данные отвечает обработчик этого маршрута.