Вопрос или проблема
У меня вопрос по mongoose..
// Сравнение шаблона местоположения с полями базы данных
let query = {
$or: [
{ name: locationPattern },
{ 'details.description': locationPattern },
{ 'location.address': locationPattern },
],
}
// Проверять свойство только если оно не 'Все'
if (propertyType && propertyType !== 'Все') {
const typePattern = new RegExp(propertyType, 'i')
query.details.propertyType = typePattern
}
Но у меня проблема на этой строке, когда я пытаюсь добавить еще один критерий в мой запрос.
query.details.propertyType = typePattern
TypeError: Невозможно прочитать свойства undefined (чтение ‘propertyType’)
В чем проблема и каков правильный синтаксис?
Правильный синтаксис для добавления критерия в мой запрос
Ответ или решение
Ваша ошибка связана с тем, что объект query.details
не инициализирован, поэтому вы получаете ошибку TypeError: Cannot read properties of undefined (reading 'propertyType')
. Когда вы пытаетесь добавить propertyType
к query.details
, JavaScript не может найти details
, потому что он не существует.
Для решения этой проблемы вам необходимо сначала инициализировать query.details
, если он еще не определен. Вы можете сделать это, проверив существование query.details
, а затем инициализировав его как объект, если такового нет. Вот как вы можете изменить ваш код:
// Match location pattern against database fields
let query = {
$or: [
{ name: locationPattern },
{ 'details.description': locationPattern },
{ 'location.address': locationPattern },
],
}
// Только добавлять критерий, если propertyType не 'All'
if (propertyType && propertyType !== 'All') {
const typePattern = new RegExp(propertyType, 'i');
// Инициализируем query.details, если он не существует
if (!query.details) {
query.details = {};
}
// Добавляем условие propertyType
query.details.propertyType = typePattern;
}
Объяснение:
-
Инициализация
query.details
:
Мы добавили проверкуif (!query.details)
, которая позволяет инициализироватьquery.details
как пустой объект{}
, если он еще не был создан. -
Добавление условия
propertyType
:
Теперь вы можете безопасно добавлятьpropertyType
кquery.details
, так какdetails
уже инициализирован как объект.
Таким образом, после этой правки код будет правильно работать, и ошибка не возникнет. Убедитесь, что вы также тестируете свои изменения, чтобы удостовериться, что ваш запрос теперь работает так, как вы ожидаете.