Как объединить запрос API GET в nodejs? - PullRequest
0 голосов
/ 24 октября 2019

У меня есть несколько запросов API Get одновременно в nodejs. Каждый 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;

Я хочу знать, возможно ли объединить их в одну функцию? Любые другие вещи, которые я должен касаться?

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Это возможно, если у вас есть обещания, которых в настоящее время нет. Вы должны обернуть свой request() вызов в Обещание. Вы можете сделать это вручную с помощью пользовательской функции 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
});
0 голосов
/ 24 октября 2019

Вы можете использовать кэш Redis для хранения данных в памяти для быстрого извлечения и извлечения из памяти очень быстро.

Кроме того, через некоторое время вы можете добавить их в базу данных путем массового создания. Это уменьшит вызов вашей базы данных.

// Пример в sequilize

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...