1
resposta

[Dúvida] Autor não encontrado, 404

Estou tentando fazer um filtro dinâmico para o autor no livros usando regex, estou conseguindo achar o autor e retornar o id dentro da função que processa a busca, mas ao chegar no filtro, ele está retornando um objeto vazio. O que estou fazendo de errado?

  static async requestBookByFilter(req, res, next) {
    try {
      const search = await processSearch(req.query);

      const filteredSearch = await books.find(search);
      if (filteredSearch !== null && filteredSearch.length !== 0) {
        res.status(200).json(filteredSearch);
      } else {
        res.status(200).send([]);
      }
    } catch (err) {
      next(err);
    }
  };
};

async function processSearch(params) {
  const { title, publisher, price, minPages, maxPages, author } = params;
  let search = {};
  if (minPages || maxPages) search.pages = {};

  if (title) search.title = { $regex: title, $options: 'i' };
  if (price) search.price = { $eq: price };
  if (publisher) search.publisher = { $regex: publisher, $options: 'i' }; // OR new RegExp(publisher, 'i')

  if (minPages) search.pages.$gte = minPages;
  if (maxPages) search.pages.$lte = maxPages;

  if (author) {
    const authorName = await authors.findOne({name: {$regex: author, $options: 'i'}});
    const authorId = authorName._id;
    console.log(authorName);
    
    if (authorName !== null) {
      search.author = authorId;
      console.log(search.author);
    } else {
      search = null;
    }
  }
  return search;
}

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Olá Oliver! Tudo bem?

Vamos revisar seu código e fazer alguns ajustes para garantir que a busca funcione corretamente.

Primeiramente, na função processSearch, você está atribuindo null à variável search quando o autor não é encontrado. Isso pode estar causando problemas na sua lógica de busca. Vamos ajustar isso para garantir que search seja sempre um objeto.

Aqui está uma versão ajustada do seu código:

async function processSearch(params) {
  const { title, publisher, price, minPages, maxPages, author } = params;
  let search = {};
  if (minPages || maxPages) search.pages = {};

  if (title) search.title = { $regex: title, $options: 'i' };
  if (price) search.price = { $eq: price };
  if (publisher) search.publisher = { $regex: publisher, $options: 'i' };

  if (minPages) search.pages.$gte = minPages;
  if (maxPages) search.pages.$lte = maxPages;

  if (author) {
    const authorName = await authors.findOne({ name: { $regex: author, $options: 'i' } });
    if (authorName !== null) {
      search.author = authorName._id;
    } else {
      search.author = null;
    }
  }
  return search;
}

static async requestBookByFilter(req, res, next) {
  try {
    const search = await processSearch(req.query);

    if (search.author === null) {
      return res.status(200).send([]);
    }

    const filteredSearch = await books.find(search);
    if (filteredSearch !== null && filteredSearch.length !== 0) {
      res.status(200).json(filteredSearch);
    } else {
      res.status(200).send([]);
    }
  } catch (err) {
    next(err);
  }
};

Algumas mudanças importantes:

  1. Se o autor não for encontrado, search.author é definido como null em vez de redefinir search para null.
  2. Na função requestBookByFilter, verificamos search.author antes de fazer a busca nos livros. Se search.author for null, retornamos uma lista vazia imediatamente.

Caso problema não seja resolvido, peço que compartilhe todo o seu projeto para que eu realize testes, envie usando o GitHub ou Drive do Google como meio.

Espero que isso resolva o problema! Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.