Как сохранить значения ответа JSON на вызов API в столько же переменных, сколько (неизвестное) количество объектов, используя node.js - PullRequest
0 голосов
/ 09 мая 2019

Я создаю интеграцию между двумя программами, и мне нужно получить данные из программного обеспечения1, чтобы опубликовать их в программном обеспечении 2.

Я пытаюсь сделать это (не стесняйтесь, если это не лучший способдля этого):

Сначала создайте вызов API для получения данных из программного обеспечения1.Во-вторых, сохраните значения ответа JSON в переменных Наконец, используйте эти переменные, чтобы отправить его обратно в software2

Проблема заключается в том, что ответ JSON от вызова API для программного обеспечения 1 может содержать неизвестное количество объектов.(Иногда это может быть просто, иногда это может быть 2,3, ..., 10 или больше)

Итак, как я могу создать столько переменных, сколько мне нужно, чтобы хранить все эти данные и иметь возможность повторного использования?после?

Я создал программу с использованием node.js

Я думаю, у меня есть кое-что, что имеет смысл, если в ответе JSON будет только один объект, но мне нужна помощь для масштабированиятаким образом он может управлять любым количеством объектов.

Просмотреть мой код ниже

Вот пример ответа JSON от программного обеспечения1

[
  {
    "id": "my-awesome-program",
    "currency": "USD",
    "title": "My awesome program",
    "cookie_time": 45,
    "default_landing_page_url": "https://my-site.com"
  }
]

Но иногда это может иметьболее одного объекта

[
  {
    "id": "my-awesome-program2",
    "currency": "USD",
    "title": "My awesome program 2",
    "cookie_time": 45,
    "default_landing_page_url": "https://my-site.com"
  }
  {
    "id": "my-awesome-program1",
    "currency": "USD",
    "title": "My awesome program 1",
    "cookie_time": 45,
    "default_landing_page_url": "https://my-site.com"
  }
]

Обратите внимание, что единственные значения, которые меня интересуют для хранения, это "id" и "title"

Вот модуль nodejs, который я использую:

const express = require('express');
const request = require('request-promise-native');
const NodeCache = require('node-cache');
const session = require('express-session');
const delay = require('delay');

Вот мой код

//====================================================//
//   Get a list of programs from software1            //
//====================================================//

const getPrograms = async () => {
  console.log('Retrieving programs');

  const headers = {
    Authorization: `Api-Key: xxxxxx`,
    'Content-Type': 'application/json'
  };

  const programs = { 
  method: 'GET',
  url: 'https://api.software1.com/1.6/programs/',
  headers: headers,
  json: true 
  };

  request(programs)
  .then(function (parsedBody) {
    console.log(parsedBody);
  })
  .catch(function (err) {
     console.log(err);
  });

// Store programs data in reusable variables
// THIS IS WHERE I NEED HELP TO CREATE AS MANY VARIABLES AS OBJECTS IN THE JSON RESPONSE
  const programObj = JSON.parse(parsedBody);
  const programId = programObj.id;
  const programTitle = programObj.title;
};

//====================================================//
//   Post the list of programs in software2           //
//====================================================//

// Creating a contact property in software2 to store programs from the list retrieved from software1 

const createPrograms = async (accessToken) => {
  console.log('Creating a property named programs');

const headers = {
  Authorization: `Bearer ${accessToken}`,
  'Content-Type': 'application/json'
};

const program = {
  headers: headers,
  method: 'POST',
  uri: 'https://api.software2.com/properties/v1/contacts/properties',
  body: {
      name: 'programs',
      label: 'Programs',
      description: 'programs in which the contact is enrolled',
      groupName: 'group_of_properties',
      type: 'enumeration',
      fieldType: 'select',
      options: [ // THIS IS WHERE I NEED HELP TO CREATE AS MANY OPTIONS AS CREATED REUSABLE VARIABLES
        {
          "label": programTitle,
          "value": programId
        },
      ]
  },
  json: true // Automatically stringifies the body to JSON
};

Спасибо за помощь!

1 Ответ

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

Я получил ответ на другом форуме, поэтому я подумал, что могу вставить его сюда для помощи сообщества.

оригинальный ответ: https://community.hubspot.com/t5/APIs-Integrations/How-to-use-the-values-of-a-JSON-response-from-an-external/m-p/269841#M24366

Чтобы просто получить данныеиз того, что вам возвращается, вы можете использовать некоторые функции более высокого порядка, такие как map:

отличное видео на YouTube: https://www.youtube.com/watch?v=rRgD1yVwIvE

MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

Например, если у вас есть такая структура данных:

[
  {
    "id": "my-awesome-program2",
    "currency": "USD",
    "title": "My awesome program 2",
    "cookie_time": 45,
    "default_landing_page_url": "https://my-site.com"
  },
  {
    "id": "my-awesome-program1",
    "currency": "USD",
    "title": "My awesome program 1",
    "cookie_time": 45,
    "default_landing_page_url": "https://my-site.com"
  }
]

, вы можете использовать этот код для отображения объектов в нечто более полезное для вас.Сначала вы можете присвоить данные переменной:

const myData = [
  {
    "id": "my-awesome-program2",
    "currency": "USD",
    "title": "My awesome program 2",
    "cookie_time": 45,
    "default_landing_page_url": "https://my-site.com"
  },
  {
    "id": "my-awesome-program1",
    "currency": "USD",
    "title": "My awesome program 1",
    "cookie_time": 45,
    "default_landing_page_url": "https://my-site.com"
  }
]

Затем мы можем отобразить данные и присвоить их новой переменной или вернуть их из функции:

const newData = myData.map(item => ({
   id: item.id,
   title: item.title
}))

// returns
// [
//   {
//     "id": "my-awesome-program2",
//     "title": "My awesome program 2"
//   },
//   {
//     "id": "my-awesome-program1",
//     "title": "My awesome program 1"
//   }
// ]

Послеэто, если вам нужно, чтобы каждый элемент затем вызывал Hubspot, вы можете сделать это с любой библиотекой, которую вы хотите, например:

   axios.post(url, config, item).then(res => {
       console.log("...Done!")
   })
});

. Было бы лучше поместить этот код в отдельную функцию послевы вернули все необходимые данные, чтобы убедиться, что все данные есть.Я также рекомендую ограничить количество вызовов в секунду, чтобы не превышать ограничение скорости передачи данных API.Хороший пакет для этого называется узким местом на NPM.

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