Ошибка перехвата Javascript, если ключ json не существует

#javascript #node.js #json #error-handling

#javascript #node.js #json #обработка ошибок

Вопрос:

Я пытаюсь перехватить ошибку, когда определенный ключ не существует в json из API, в данном случае imageLinks.thumbnail.

Это то, что я написал до сих пор, но я все еще получаю TypeError: не удается прочитать свойство ‘thumbnail’ для undefined.

             let cover;
            if(results.imageLinks === undefined){

                let cover = "http://actar.com/wp-content/uploads/2015/12/nocover.jpg";

            } else {
                let cover = results.imageLinks.thumbnail;
            };
  

Помощь была бы очень признательна.

Приветствия

Комментарии:

1. Это очень мало информации для отладки, не возражаете ли вы добавить, что есть results и что оно содержит? и я не понимаю, почему вы используете let cover в 3 разных местах, потому что каждый раз, когда вы это делаете, создается новая переменная, если вы хотите использовать ту же переменную, просто определите ее один раз и используйте.

2. Вы уверены, что получаете эту ошибку в этой строке? Где-нибудь еще вы ссылаетесь на него? ПРИМЕЧАНИЕ: этот вопрос имеет мало общего с получением JSON из API. Вы имеете дело с объектами JavaScript, а не с JSON.

3. Если results.imageLinks значение не определено, он никогда не выполнит else блок.

Ответ №1:

Вы можете использовать оператор IN

 if('imageLinks' in results)
  

Ответ №2:

Используйте hasOwnProperty()

 (function() {
  let cover;
  const result = {
    imageLinks: {}
  };
  if (!Object.hasOwnProperty.call(result, 'imageLinks')) {
    return;
  }
  if (Object.hasOwnProperty.call(result.imageLinks, 'thumbnail')) {
    cover = results.imageLinks.thumbnail;
  } else {
    cover = "http://actar.com/wp-content/uploads/2015/12/nocover.jpg";
  }
  console.log(cover);
})();  

Ответ №3:

Ваш вопрос кажется немного двусмысленным.
Я постараюсь ответить на основе того, что я понимаю из вашего кода.
Похоже, у вас есть объект с именем results, который может иметь или не иметь свойство imageLinks.
Поэтому вам нужно установить флажок «если результаты имеют свойство imageLinks, назначить обложку results.imageLinks.thumbnail, в противном случае назначить «http://actar.com/wp-content/uploads/2015/12/nocover.jpg«

 let cover = results['imageLinks']['thumbnail'] ? results['imageLinks']['thumbnail'] : "http://actar.com/wp-content/uploads/2015/12/nocover.jpg";
  

Пожалуйста, обратите внимание, что проверка, которую я установил, является более полной. Это пройдет, только если структура объекта {'results' : 'imageLinks': {'thumbnail' : 'some value'}}
Если вы хотите проверить только ‘imageLinks’, замените результаты ['imageLinks']['thumbnail'] на results['imageLinks']
В JS in вы хотите проверить наличие ключа в объекте, который вы можете напрямую записать if(results['imageLinks']) .