如何:从2个API获取数据,比较,POST bool

时间:2018-04-27 21:43:06

标签: node.js api express request async-await

我正在开展一个项目,要求我:

  1. 从API1获取ID,将ID推送到数组中,然后映射这些ID,将它们用于第二个GET请求,其中ID用作API2 GET请求的参数,填充ID或N的数组for“Not existing” - 然后调用此数组:

  2. POST请求。这篇文章映射了GET请求中返回的数组。如果该项目不是“N”,它将以检查的方式发送到API1:true。如果该项目为“N”,它会通过电子邮件告诉我们API2缺少此项目。

  3. 我希望这个系统每2小时自动执行一次GET和POST,所以我正在使用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:需要向API 1发出GET请求,然后向API 2发出另一个GET请求(使用来自API 1的ID作为参数),然后将数据从第二个GET发送到POST请求,然后执行更新API 1的数据或电子邮件客户支持。这是一个每两小时运行一次的自动系统。

    主要问题: 1.在get req中有一个setInterval可以吗? 2.我可以让GET请求自动调用POST请求吗? 3.如果是,我如何将GET请求数据传递给POST请求?

1 个答案:

答案 0 :(得分:1)

要使它适用于您的两个调用,一个帖子和一个调用,您必须执行Ajax调用以获取另一个方法中的后处理信息。

我希望这有效。