使用Express,Node.JS和Require Module进行外部API调用

Dav*_*lia 18 javascript 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;
Run Code Online (Sandbox Code Playgroud)

我正在尝试对Giant Bomb API进行API调用,以恢复有关魔兽世界的任何数据.

问题是,路线刚加载; 它没有做任何事情或它没有超时,它只是连续加载.

我不知道我做错了什么,但话虽如此......我也不知道什么是对的.我一直在努力学习.

任何帮助都会很棒.

谢谢

jfr*_*d00 32

您需要获取您获得的数据request()并将其作为对原始Web服务器请求的响应发回.它只是不断加载,因为你从未对原始请求发送任何类型的响应,因此浏览器只是坐在那里等待响应回来,最终,它会超时.

由于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;
Run Code Online (Sandbox Code Playgroud)

这将.pipe()request()结果到res对象,它会成为原来的HTTP请求的响应.

相关答案:如何代理请求作为响应


Jay*_*Mor 8

对于 Laravel 用户来说,

如果没有的话首先安装npm i axios包。

var axios = require('axios');

var config = {
    /* Your settings here like Accept / Headers etc. */
}

axios.get('http://local.dev/api/v1/users', config)
.then(function(response) {
    console.log(response.data);
    console.log(response.status);
    console.log(response.statusText);
    console.log(response.headers);
    console.log(response.config);
});
Run Code Online (Sandbox Code Playgroud)

希望它能帮助别人!