【问题标题】:How to combine API GET request in nodejs?如何在 nodejs 中结合 API GET 请求?
【发布时间】:2019-10-24 00:12:32
【问题描述】:

我在 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;

我想知道是否可以将它们组合成一个功能? 还有什么需要注意的吗?

【问题讨论】:

    标签: javascript node.js rest api express


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您可以使用 Redis 缓存将数据存储在内存中,以便快速检索和快速从内存中获取。

      此外,在一段时间后,您可以通过批量创建将它们添加到数据库中。它会减少您的数据库调用。

      // sequilize 中的示例

      等待 db.table_name.bulkcreate([ {0bj1}, {obj2}..,{obj3 } ]);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-25
        • 1970-01-01
        • 1970-01-01
        • 2020-11-23
        • 1970-01-01
        • 1970-01-01
        • 2018-01-03
        • 2013-08-01
        相关资源
        最近更新 更多