@formasters777

Цепочка запроса с пустым значением?

У меня есть база данных фильмов, и все категории находятся на сервере,
я формирую запрос одной линией:
let genre = req.query.genre || "All";

 const genreOptions = [
			"drama",
			"comedy",
			"triller",
		];

 genre === "All"   ? (genre = [...genreOptions])   : (genre = req.query.genre.split(","));

const movies = await Movie .find({ name: { $regex: search, $options: "i" } })
   .where("category")
    .in([...genre])
      .sort(sortBy)
       .skip(page * limit)
	.limit(limit);


Если я добавляю подкатегорию к фильмам, например subcategory: "mysubcategory"
и меняю запрос, всё также работает:
const movies = await Product.find({ productname: { $regex: search, $options: "i" } })
    .where("category")
    .in([...genre])
         .where('subcategory')
         .equals([...subcat])
			.sort(sortBy)
			 .skip(page * limit)
			  .limit(limit);

Но, если я убираю условие показа subcat:
subcat === "All" ? (subcat= [...genreOptions]) : (subcat= req.query.subcat.split(","));
на другое условие или вообще без условия:
subcat= req.query.subcat.split(",")
Node js пишет мне в консоли:
"TypeError: subcat is not iterable"

или
"TypeError: Cannot read properties of undefined (reading 'split')"

Мой запрос выглядит так: localhost:8000/api/movies?genre=drama

При такой конструкции запроса, если не указывать -- || "All" -- альтернативный массив для показа, если такого query нет, происходит ошибка.
Возможно ли указать пустое значение в такой цепочке, если query не приходит, чтоб запрос выполнялся дальше?

Моя база данных выглядит, как:
"_id": "6420a90744a448b197042db0",
"name": "Stalker and Treasure",
genre": "drama",
"subcategory": "mysubcategory",
"actors": "A.Dolton, M.Romario, T.Milano",
  • Вопрос задан
  • 47 просмотров
Решения вопроса 1
neuotq
@neuotq
Прокрастинация
Понятно почему, потому в первом случае на subcat используете spread оператор, которые не сработает если объект не итерируемый.
Во втором случае похожая проблема, у вас неопределена переменная(в данном случае свойство) и вы вызываете на ней метод сплит.
Я бы упростил.
// genre, search и тп как то подготовлены, в них значения верного типа либо нул
// Например (упрощенный )
const genre = req.query.genre ? req.query.genre.split(",") : null;

const searchQuery = search ? { name: { $regex: search, $options: "i" } } : {};
const genreQuery = genre ? { genre: { $in: genre } } : {};
const subcategoryQuery = subCategory ? { genre: { $in: subCategory } } : {};
const actorsQuery = actors ? { actors: { $in: actors } } : {};
const movies = await Movie.find(
        { ...searchQuery, ...genreQuery, ...subcategoryQuery, ...actorsQuery }
    ).exec();

Кстати, по поводу модели, может в жанрах и актерах не строку использовать? Правда останется проблема переименований, к примеру опечатка в имени актера , но это уже отдельная история, пусть будет за рамками.
// "_id": "6420a90744a448b197042db0",
// "name": "Stalker and Treasure",
// genre":  [ "drama"],
// "subcategory": "mysubcategory",
// "actors": [ "A.Dolton", "M.Romario", "T.Milano" ],
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы