Внешние вызовы 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;
и посмотреть, какие данные отвечает обработчик этого маршрута.