使用 Express、Node.JS 和 Require 模块调用外部 API

新手上路,请多包涵

我有如下路线:

 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;

我正在尝试对 Giant Bomb API 进行 API 调用,以取回它拥有的有关魔兽世界的任何数据。

问题是,路线刚刚加载;它什么都不做,也不会超时,它只是持续加载。

我不知道我做错了什么,但话虽这么说……我也不知道什么是对的。我正在努力学习。

任何帮助都会很棒。

谢谢

原文由 Dave Melia 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 295
2 个回答

您需要获取从 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;

这将 .pipe() request() 结果变成 res 对象,它将成为对原始 http 请求的响应。

此处的相关答案: How to proxy request back as response


2021 年 编辑 request() 库现已弃用,不再推荐用于新代码。有很多 选择 可供选择。我最喜欢的是 got() 库。可以像这样使用它来完成上述操作。这也升级为使用 pipeline() 函数,它是 .pipe() 的更好版本,具有更完整的错误处理。

 const router = require('express').Router();
const got = require('got');
const { pipeline } = require('stream');

router.get('/', function(req, res) {
  const dataStream = got.stream({
      uri: 'http://www.giantbomb.com/api/search',
      qs: {
        api_key: '123456',
        query: 'World of Warcraft: Legion'
      }
  });
  pipeline(dataStream, res, (err) => {
      if (err) {
          console.log(err);
          res.sendStatus(500);
      }
  });
});

module.exports = router;

原文由 jfriend00 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于 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);
});

希望它能帮助别人!

原文由 Jaydeep Mor 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏