2016-09-02 12 views
10

Mam trasą jak następuje:Zewnętrzna wywołań API Z Express, node.js i wymagają Moduł

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; 

Próbuję nawiązać połączenie API do Giant Bomb API przywrócić niezależnie od danych ma o World of Warcraft.

Problem polega na tym, że trasa właśnie się ładuje; to nic nie robi lub nie kończy się, to ciągłe ładowanie.

Nie wiem, co robię źle, ale to znaczy ... Nie wiem też, co jest słuszne. Próbuję się uczyć, jak idę.

Każda pomoc będzie świetna.

Dzięki

+0

Pierwsza odpowiedź powinna dać jakąś wskazówkę co do tego, co się dzieje ... ale można rozwinąć „to tylko ciągła loading”? Czy to znaczy, że prośba nigdy się nie kończy? Trasa nigdy nie zostanie rozwiązana? Czy masz jakiekolwiek wskazówki, że tak właśnie jest? A może po prostu nie otrzymujesz odpowiedzi? –

Odpowiedz

12

Musisz pobrać dane, które otrzymałeś od request() i odesłać je jako odpowiedź na pierwotne żądanie serwera WWW. Trwało to ciągle, ponieważ nigdy nie wysłałeś żadnej odpowiedzi na pierwotną prośbę, więc przeglądarka właśnie tam siedziała czekając na odpowiedź, aby wrócić i ostatecznie minie limit czasu.

Od request() obsługuje strumienie, można odesłać dane jako odpowiedź bardzo prosto za pomocą .pipe() tak:

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; 

Będzie .pipe() wynik request() do obiektu res i stanie się on odpowiedzią na oryginalne żądanie http.

Powiązane odpowiedź tutaj: How to proxy request back as response

+0

Fantastyczne, zadziałało. Dziękuję Ci bardzo! –

+0

Świetna odpowiedź. Próbuję użyć podobnej konfiguracji, ale chcę też użyć Node 'apicache' i mówiąc, że' apicache' działa dobrze z 'express' ta konfiguracja pomogłaby oprogramowaniu pośredniczącemu w buforowaniu zewnętrznej odpowiedzi API. – Annjawn

1

Za każdym trasie Express konieczne jest wysłanie odpowiedzi (częściowe lub całkowite) lub zadzwoń next, albo jedno i drugie. Twój program obsługi trasy nie działa. Wypróbuj

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; 

i zobacz, jakie dane odpowiada ten program obsługi trasy.

+0

Dzięki za wejście, ale niestety otrzymuję ten sam wynik. Jeśli wystarczająco długo ładuję stronę, pojawia się komunikat, że strona nie działa i nie wysłała niczego. –

Powiązane problemy