首页 > 解决方案 > 如何在 nodejs 中结合 API GET 请求?

问题描述

我在 nodejs 中一次有几个 API Get 请求。每个 API 每隔几分钟就会有新数据。

var express = require('express');
var router = express.Router();
var request = require("request");

let value1, value2, bodyData1, bodyData2;

var options = { method: 'GET',
  url: 'https://api.example.com/data1',
  qs: 
   { 
     valueType: 'MAXIMUM'
   },
  headers: 
   { 
     authorization: 'ABC123456',
     accept: 'application/json; charset=utf-8' } };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  bodyData1 = JSON.parse(body);
  value1 = bodyData1.value;
});

var options = { method: 'GET',
  url: 'https://api.example.com/data2',
  qs: 
   { 
     valueType: 'MAXIMUM'
   },
  headers: 
   { 
     authorization: 'ABC123456',
     accept: 'application/json; charset=utf-8' } };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  bodyData2 = JSON.parse(body);
  value2 = bodyData2.value;
});

router.get('/', function(req, res, next) {
  res.render('home', {valueA : value1, valueB: value2});
});

module.exports = router;

我想知道是否可以将它们组合成一个功能?还有什么我应该关心的吗?

标签: javascriptnode.jsrestapiexpress

解决方案


如果您有当前没有的承诺,这是可能的。你必须把你的request()电话包装在一个 Promise 中。您可以使用自定义功能手动完成requestToPromise

然后,您可以使用Promise.all并行调用多个承诺。

function requestToPromise(options) {
  return new Promise((resolve, reject) => {
    request(options, (error, response, body) => {
      if (error) return reject(error);
      resolve(body);
    });
  });
}

var optionsRequest1 = {
  method: "GET",
  url: "https://api.example.com/data1",
  qs: {
    valueType: "MAXIMUM"
  },
  headers: {
    authorization: "ABC123456",
    accept: "application/json; charset=utf-8"
  }
};
var optionsRequest2 = {
  method: "GET",
  url: "https://api.example.com/data2",
  qs: {
    valueType: "MAXIMUM"
  },
  headers: {
    authorization: "ABC123456",
    accept: "application/json; charset=utf-8"
  }
};

var requestPromise1 = requestToPromise(optionsRequest1);
var requestPromise2 = requestToPromise(optionsRequest2);
Promise.all([requestPromise1, requestPromise2]).then(results => {
  var [resultPromise1, resultPromise2] = results;
}).catch(error => {
  //handle error
});

除了使用自定义功能requestToPromise,您还可以使用util.promisify

const util = require('util');

const requestAsync = util.promisify(request);
Promise.all([requestAsync(optionsRequest1), requestAsync(optionsRequest2)]).then(results => {
  var [resultPromise1, resultPromise2] = results;
}).catch(error => {
  //handle error
});

推荐阅读