简体   繁体   English

如何在nodejs中结合API GET请求?

[英]How to combine API GET request in nodejs?

I have several API Get request at once in nodejs.我有几个 API 在nodejs中一次获取请求。 Each API have new data every couple minutes.每个 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;

I want to know if it is possible to combine them into one function?我想知道是否可以将它们组合成一个 function? Any other things I should concern?还有什么我应该关心的吗?

You can use Redis cache to store data in memory for fast retrieval and fetch from memory very quickly.您可以使用 Redis 缓存将数据存储在 memory 中,以便快速检索并快速从 memory 中获取数据。

Also, after some interval, you can add them to a database through bulk creation.此外,在一段时间后,您可以通过批量创建将它们添加到数据库中。 It will decrease your database call.它将减少您的数据库调用。

// Example in sequilize // sequilize 中的示例

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

It is possible if you have promises which is currently not the case.如果您有当前没有的承诺,这是可能的。 You have to wrap your request() call in a Promise.您必须将您的request()调用包装在 Promise 中。 You can do it manually with a custom function requestToPromise .您可以使用自定义 function requestToPromise手动完成。

You can then use Promise.all to call multiple promises in parallel.然后,您可以使用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
});

Instead of using the custom function requestToPromise you can also use util.promisify除了使用自定义 function 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
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM