Как: получить данные из 2 API, сравнить, POST bool - PullRequest
0 голосов
/ 28 апреля 2018

Я работаю над проектом, который требует от меня:

  1. GET ID из API1, поместите идентификаторы в массив, затем сопоставьте эти идентификаторы, используя их для второго запроса GET, где идентификаторы используются в качестве параметров для запроса API2 GET, заполняет массив идентификаторами или N для «Не существует» - этот массив затем вызывается в:

  2. Запрос POST. Этот пост сопоставляется с возвращенным массивом из запроса GET. Если элемент не "N", он ВЫСТАВЛЯЕТ API1 с флажком: true. Если элемент "N", он отправляет нам электронное письмо с сообщением о том, что API2 отсутствует в этом проекте.

Я хочу, чтобы эта система автоматически выполняла GET и POST каждые 2 часа, поэтому я использую setInterval (не уверен, что это лучшая идея). РЕДАКТИРОВАТЬ: Cron работа будет лучшим решением.

Я работаю с NodeJS, Express, Request-Promise, Async / Await.

Вот мой псевдокод:

// Dependencies
const express = require('express');
const axios = require('axios');
const mailgun = require('mailgun-js')({ apiKey, domain });

// Static
const app = express();


app.get('/', (req, res, next) => {
  // Replace setInterval with Cron job in deployment

  // Get All Ids
  const orders = await getGCloud();

  // Check if IDs exist in other API
  const validations = await getProjectManagementSystem(orders);

  // If they exist, POST update to check, else, mailer
  validations.map(id => {
    if (id !== 'n') {
      postGCloud(id);
    } else {
      mailer(id);
    }
  });   
}

// Method gets all IDs
const getGCloud = async () => {
  try {
    let orders = [];
    const response = await axios.get('gCloudURL');
    for (let key in response) {
      orders.push(response.key);
    }
    return orders;
  } catch (error) {
    console.log('Error: ', error);
  }
}

// Method does a GET requst for each ID
const getProjectManagementSystem = async orders => {
  try {
    let idArr = [];
    orders.map(id => {
      let response = await axios.get(`projectManagementSystemURL/${id}`);
      response === '404' ? idArr.push('n') : idArr.push(response)
    })
    return idArr;
  } catch (error) {
    console.log('Error: ', error);
  }
}

const postGCloud = id => {
  axios.post('/gcloudURL', {
    id,
    checked: true
  })
  .then(res => console.log(res))
  .catch(err => console.log(err))
}

const mailer = id => {
  const data = {
    from: 'TESTER <test@test.com>',
    to: 'customerSuppoer@test.com',
    subject: `Missing Order: ${id}`,
    text: `Our Project Management System is missing ${id}. Please contact client.`    
  }

  mailgun.messages().send(data, (err, body) => {
    if (err) {
      console.log('Error: ', err)
    } else {
      console.log('Body: ', body);
    }
  });
}

app.listen(6000, () => console.log('LISTENING ON 6000'));

TL; DR: необходимо выполнить GET-запрос к API 1, затем еще один GET-запрос к API 2 после него (используя идентификаторы из API 1 в качестве параметров), затем отправить данные из второго GET в запрос POST, который затем либо обновляет данные API 1 или по электронной почте. Это автоматическая система, которая запускается каждые два часа.

Основные вопросы: 1. Можно ли использовать setInterval в get req? 2. Могу ли я получить запрос GET, чтобы автоматически вызвать запрос POST? 3. Если да, как я могу передать данные запроса GET в запрос POST?

1 Ответ

0 голосов
/ 15 мая 2018

Чтобы это работало на оба ваших звонка - одно сообщение и одно полученное, вам нужно выполнить Ajax-вызов, чтобы получить информацию о постобработке другим методом.

Надеюсь, это сработает.

...