3
respostas

Erro 500 ao recuperar livro

Meu código esta retornando erro 500. Alguém consegue me ajudar?

https://github.com/aeusteixeira/api-de-gerenciamento-de-livros

async getBookByFilter(request, response, next) {
        try {
            const search = await this.handleFilter(request.query);
            const data = BookModel.find(search);
        } catch (error) {
            next(error);
        }
    }

    async handleFilter(params) {
        const { editora, titulo, autor, min_paginas, max_paginas } = params;
        let search = {};

        if(editora) search.publish_company = editora;
        if(titulo) search.title = { $regex: titulo, $options: 'i'};
        if(min_paginas || max_paginas) search.pages = {};

        if(autor){
            const author = await AuthorModel.findOne({ name: autor });
            search.author = author._id;
        }

        return search;
    }
3 respostas

Oi, Matheus, tudo bem?

Você pode mandar aqui a URL da requisição que está causando o erro? Pode ser que haja alguma diferença entre os parâmetros de busca da URL e os que são esperados pelo código (que são editora, titulo, autor, min_paginas e max_paginas).

Mas o que eu acredito que seja o seu erro é que você não está adicionando no objeto search.pages as tratativas dos parâmetros min_paginas e max_paginas. Depois do seu código if(min_paginas || max_paginas) search.pages = {};, estaria faltando algo assim:

  if (minPaginas) search.pages.$gte = min_paginas;

  if (maxPaginas) search.pages.$lte = max_paginas;

Por fim, confira também se os nomes dos campos no objeto de busca correspondem aos nomes dos campos do banco de dados. Pelo seu código, os campos do banco de dados devem ser publish_company, title, pages e author na coleção de livros.

Ah, e para te ajudar a descobrir o erro, você também pode dar um console.log(error) dentro do bloco catch ou mesmo dentro do manipulador de erros.

Espero ter ajudado! Abraços e bons estudos :)

Professor, não sei pq, mas ele não consegue pegar o codigo da função handleFilter. Olha como eu fiz aqui pra testar, ele entra no erro mesmo assim.! URL: http://localhost:3000/books/search?titulo=Harry%20Potter

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

(https://cdn1.gnarususercontent.com.br/1/532739/14a69426-58df-4a4f-86f5-10049d3b37d1.png)

Oi, Matheus, desculpe a demora a responder.

Não vou conseguir testar a partir desse link que você mandou, porque o localhost funciona apenas no seu computador.

Mas olhando novamente seu código, notei que seus métodos getBookByFilter e handleFilter não estão estáticos (eles não utilizam a palavra-chave static).

Você está criando uma instância da classe LivroController no arquivo livrosRoutes.js? Você pode mandar os códigos completos dos arquivos livrosRoutes.js e livrosController.js aqui.

Mas de qualquer forma, você pode fazer o seguinte: você pode criar a função handleFilter como uma função normal ao fim do arquivo livrosController.js, sem ser um método da classe LivroController, que é o foi feito na aula. Além disso, você vai trocar this.handleFilter por apenas handleFilter. O código fica assim:

class LivroController {
    // outros métodos omitidos...

    async getBookByFilter(request, response, next) {
        try {
            const search = await handleFilter(request.query);  // eu removi o `this` que estava sendo utilizado nessa linha
            const data = BookModel.find(search);
        } catch (error) {
            next(error);
        }
    }
}

// a função é declarada fora da classe:
async function handleFilter(params) {
    // código da função omitido...
}

Veja se funciona!