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

egdjgwm8  于 2022-11-04  发布在  Node.js
关注(0)|答案(4)|浏览(187)

我有一条路线如下:

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调用,以恢复它所拥有的有关魔兽世界的任何数据。
问题是,这条路线只会装货;它什么都不做,也不会超时,它只是不断地加载。
我不知道我做错了什么,但话虽如此......我也不知道什么是对的。我在沿着学习。
任何帮助都是最好的。
谢谢

fhg3lkii

fhg3lkii1#

你需要把从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请求的响应。
相关答案如下:如何将请求代理回作为响应

在2021中编辑。request()库现在已经被弃用,不再推荐用于新代码。有许多alternatives库可供选择。我最喜欢的是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;
vddsk6oq

vddsk6oq2#

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

并查看该路由处理器以什么数据进行响应。

92dk7w1h

92dk7w1h3#

在2022年

In节点

const fetch = (...args) => import('node-fetch').then(({default: fetch}) => 
 fetch(...args));

app.get('/checkDobleAPI', async (req, res) => {
try {

const apiResponse = await fetch(
 'https://jsonplaceholder.typicode.com/posts' 
)
const apiResponseJson = await apiResponse.json()

console.log(apiResponseJson)
res.send('Running 🏃')
} catch (err) {
console.log(err)
res.status(500).send('Something went wrong')
}
})

相关问题