Захватить часть ответа JSON и сохранить в переменную? - PullRequest
2 голосов
/ 29 апреля 2020

У меня есть вопрос, который я провел последние несколько дней с моим другом Google, пытаясь ответить. Это код из проекта, над которым я сейчас работаю, и я пытаюсь взаимодействовать с двумя API.

Здесь вы видите вызов первого API, использующего форматирование библиотеки GOT для получения ответа JSON.

    var products

    //Printify call for products list
    (async () => {
        try{
            const list = await redd('shops/shopId/products.json');


            //Catch the Data array and save it into the variable products
            var obj = new JSONObject(response);
            products = obj.getJSONArray("data");


        }

        catch(error) {

        }


    })();

    //Print the variable products to the console
    console.log(products)

Я создаю новый JSONObject из ответа, извлекаю массив данных из этого ответа и помещаю его в продукты Variable, которые были определены вне этой функции. Наконец я пытаюсь распечатать переменную в консоли.

В конце концов мне нужно будет взять этот массив «data» и проанализировать определенные элементы c внутри него (т.е. title: , description: , images:) и передать его в качестве значения в следующий API.

В настоящее время я получаю «неопределенный» ответ от консоли. Не уверен, что я делаю неправильно, надеясь, что я могу получить помощь или направление. Все ценится, спасибо всем заранее!

Ответы [ 3 ]

1 голос
/ 05 мая 2020

Я наконец смог заставить все это работать. Прошло уже не так много времени, как я решил, но хотел убедиться, что это сработало. Вот последний код, который работал для меня:

//Config for a new GOT instance, to use redd as the variable with the attached headers and options
const redd = got.extend({
    prefixUrl: 'https://api.printify.com/v1',
      responseType: 'json',
      headers: {
          'Authorization': 'Bearer ' + apiKey 
      }
});

var productsParsed //Setting up global variable to accept the array from the JSON response body

//Printify call for products list
getProducts = async () => {
    try{
        const response = await redd('shops/' + shopId + '/products.json');
        productsParsed = response.body.data; //Data is the array in the body I need access to, and saving that into the var productsParsed

        //Returning the var with the new value
        return productsParsed

    }
    catch(error) {
        console.log(error.response);
    }
};

getProducts().then(console.log); //Printing the return value from getProducts() which verifies the var contains the needed value

Таким образом, решение оказалось довольно простым. Я просто не до конца понял структуру GOT. Я должен был использовать точечную нотацию, чтобы зафиксировать мое возвращаемое утверждение. После этого я смог использовать мою глобальную переменную, которую я настроил для принятия значения тела ответа JSON. Спасибо всем за ваши предложения и помощь. Я надеюсь, что этот пост сможет помочь другим людям, находящимся в подобной ситуации со мной.

0 голосов
/ 29 апреля 2020

Поскольку это асинхронная функция c, console.log вызывается до завершения работы асинхронной функции c. Переместите его внутрь функции asyn c, и оно должно работать.

var products

    //Printify call for products list
    (async () => {
        try{
            const list = await redd('shops/shopId/products.json'); // we wait for the response here


            //Catch the Data array and save it into the variable products
            var obj = new JSONObject(response);
            products = obj.getJSONArray("data");

            //Print the variable products to the console will work here
            console.log(products)
        }

        catch(error) {

        }
    })();

0 голосов
/ 29 апреля 2020

Вы определили асинхронную функцию c, но вы не ожидали ее результата.

Я думаю, что добавление await перед сайтом вызовов исправит это.

...