Проверка на неопределенное в операторах if, приводящая к неперехваченным ошибкам, поскольку элемент в if не определен. Что делать?

#javascript #node.js #mongodb #mongodb-atlas #oboe.js

#javascript #node.js #mongodb #mongodb-atlas #oboe.js

Вопрос:

Я вижу, что в SO используется не так много тегов oboe, но, пожалуйста, помогите, если можете, это скорее общий вопрос javascript о передаче неперехваченных ошибок для undefined . Спасибо! ~

Я использую Oboe.js для потоковой передачи данных на веб-страницу из коллекции атласа MongoDB. В MongoDB JSON некоторые _id имеют путь item.image.filename , который является путем к изображению. У некоторых нет item.image .имя файла, поскольку не всем потоковым элементам требуется изображение. Загрузка останавливается, когда появляется неопределенное значение, и я вижу ошибку в консоли.

Я бы ожидал, что если значение отсутствует, то oboe просто перейдет к следующей записи в качестве поведения по умолчанию. Однако _id без пути к изображению генерируют исключение в операторе if, который я использую, чтобы исключить их. Я хочу прояснить этот item.image.имя файла отсутствует, в нем нет значения или установлено значение null, оно просто не существует. Из того немногого, что я знаю о MongoDB, гибкость, позволяющая каждому элементу быть уникальным, является одним из его больших преимуществ.

Я полагаю, что я использовал все способы проверки этого с помощью операторов if, даже используя блок try catch , но при компиляции сам оператор if выдает эту ошибку : oboe-browser.min.js:5 Uncaught Error: Cannot read property 'filename' of undefined at oboe-browser.min.js:5 . Блок if else отобразит html без изображения, если оно не определено, в противном случае оно отобразится.

Одним из способов исправить это было бы добавить a item.image.filename к каждой записи, но я бы предпочел этого не делать, записей много, это мое последнее средство. Кажется, лучше подождать, чтобы разобраться с этим.

Вот что я пробовал:

if(!item.image.filename)

if(item.image.filename === undefined)

if(item.image.filename == 'undefined')

if(item.image.filename == undefined)

if(item.image.filename === 'undefined')

if(item.image.filename === null)

if(item.image.filename == null)

Я выбрал альтернативный маршрут if(item.image.filename !== undefined) , как с кавычками, так и без кавычек, а также с null .

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

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

1. Как выглядят данные?

2. вы можете попробовать if(item.image amp;amp; item.image . filename) возвращает или if(item.image. имя файла в json) возвращает

3. Не могли бы вы добавить, как выглядит ваш вызов oboe? Я подозреваю, что это упростит отладку 😀

4. Привет всем, я понял это. Я должен был посмотреть, был ли item.image неопределенным, а не item.image . имя файла. Как только я это изменил, я был в хорошей форме.

Ответ №1:

Вы захотите использовать typeof :

 if(typeof item !== 'object' || typeof item.image !== 'object' || item.image.filename === undefined){
  console.log("undefined as far as you're concerned");
} 

Что вам нужно знать, так это то, что вы не можете выполнить === undefined тест для переменной, которая не была объявлена. Но это нормально, чтобы выполнить этот тест для свойства объекта, которое не существует, если объект существует.

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

1. Ваша публикация item.image и не item.image.filename привела к решению. Код будет работать только в том случае, если проверка на неопределенность первого, но не более позднего варианта. Итак, я закончил тем, что использовал в своем коде троичный элемент, подобный этому. Я действительно спускался в крысиную нору. Спасибо. « ${item.image ? <img class="card-img-top thumbnail" src="/images/ item.image. имя файла " alt=""></img> : `} «

Ответ №2:

попробуйте что-то вроде этого:

 if(item.image.filename in this)
 

или

 if(!(item.image.filename in this))
 

где это объект или массив

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

1. Хотел бы я лучше понимать «это» в JS, но к решению меня привел StackSlave. В конце концов мне пришлось использовать троичный, гораздо более чистый.

2. да, его решение лучше, но если вы хотите, я могу объяснить вам «это» и то, что оно использует, просто отметьте меня здесь