как настроить внутренний контроллер узла для работы с динамическими запросами

#node.js #typescript

Вопрос:

Получен запрос, который выводит список продуктов из БД по категориям и полу с помощью запросов. Я хочу, чтобы запрос работал только с категорией или полом.

Вот внутренний контроллер —

 const getProducts = async (
  req: IgetProductsRequest,
  res: IgetProductsResponse
) => {
  ServerGlobal.getInstance().logger.info(
    `<getProducts>: Start processing request filtered by 
category ${req.query.category} and gender ${req.query.gender}`
  );

  if (!ServerGlobal.getInstance().isValidCategoryValue( req.query.category!) amp;amp; !ServerGlobal.getInstance().isValidGenderValue( req.query.gender!)) {
    ServerGlobal.getInstance().logger.error(
      `<getProducts>: Failed to get products because of invalid gender and category filtered by category ${req.query.category} 
and gender ${req.query.gender}`
    );

    res.status(400).send({
      success: false,
      message: "Please provide valid gender and category",
    });
    return;
  }

  try {
    const products = await ProductDB.find({
      category:  req.query.category!,
      gender:  req.query.gender!,
    });

    ServerGlobal.getInstance().logger.info(
      `<getProducts>: Successfully got the products filtered by 
category ${req.query.category} and gender ${req.query.gender}`
    );

    res.status(200).send({
      success: true,
      message: "Successfully retrieved products",
      data: products.map((product) => ({
        id: product.id as string,
        category: {
          value: product.category,
          label: ServerGlobal.getInstance().getCategoryLabel(product.category)!,
        },
        gender: {
          value: product.gender,
          label: ServerGlobal.getInstance().getGenderLabel(product.gender)!,
        },
        title: product.title,
        description: product.description,
        price: product.price,
        imageFileName: product.imageFileName,
      })),
    });
    return;
  } catch (e) {
    ServerGlobal.getInstance().logger.error(
      `<getProducts>: Failed to get products filtered by 
category ${req.query.category} and gender ${req.query.gender} because of server error: ${e}`
    );

    res.status(500).send({
      success: false,
      message: "Server error",
    });
    return;
  }
};
 

IgetProductsRequest

 interface IgetProductsRequest extends express.Request {
  readonly query: Readonly<{
    gender?: string;
    category?: string;
  }>;
}
 

Если я использую — http://localhost:3000/product/list?gender=2amp;category=1 это хорошо работает.

Но когда я пытаюсь отправить, например, — http://localhost:3000/product/list?gender=2 я получаю ошибку, потому что отправляю категорию=не определено.

Что я могу сделать, чтобы сделать контроллер динамичным только для категории пола?