1
resposta

[Dúvida] Mensagem personalizada de erro não é mostrada corretamente

Bom dia! Estou com um problema aqui para mostrar os erros personalizados. Testando com o Postman, apenas recebo a mensagem : Invalid ID format, sendo que deveria receber outras mensagens, como no código da aula. O que estou fazendo errado? Estou recebendo um "null". Vou mostrar aqui no Postman

Postman normal, buscando um livroTamanho correto de id, mas que deveria lançar o erro de Invalid

O meu handler de erros:

import mongoose from "mongoose";

// eslint-disable-next-line no-unused-vars
function errorHandler(error, req, res, next) {
    if (error instanceof mongoose.Error.CastError) {
        res.status(400).send({
            message: "Invalid ID format",
        });
    } else {
        res.status(500).send({
            message: "Internal server error",
        });
    }
}
export default errorHandler;
import { author } from "../models/Author.js";
import book from "../models/Book.js";

class BookController {
    static async listBooks(req, res, next) {
        try {
            /*.find() -> método do mongoose, se conecta com o banco MongoDb, encontrando tudo que tem,
   pois não foi especificado nada */
            const listBooks = await book.find({});
            res.status(200).json(listBooks);
        } catch (error) {
            next(error);
        }
    }
    static async registerBook(req, res, next) {
        //req.body -> corpo da requisição, para usar um POST, precisamos usar o body para enviar como request
        const newBook = req.body;

        try {
            const authorFound = await author.findById(newBook.author);
            const completeBook = {
                ...newBook,
                author: { ...authorFound._doc },
            };
            await book.create(completeBook);

            res.status(201).json({
                message: "Created successfully",
                book: newBook,
            });
        } catch (error) {
            next(error);
        }
    }
    static async listBookById(req, res, next) {
        try {
            const id = req.params.id;
            /*.findById() -> método do mongoose, se conecta com o banco MongoDb, encontrando pelo ID */
            const foundBook = await book.findById(id);
            res.status(200).json(foundBook);
        } catch (error) {
            next(error);
        }
    }
    static async updateBookById(req, res, next) {
        try {
            const id = req.params.id;

            /*.findByIdAndUpdate() -> método do mongoose, se conecta com o banco MongoDb,
             encontrando pelo ID e atualizando o registro. A função precisa do ID e do body da requisição para
             saber o que precisa ser atualizado */
            await book.findByIdAndUpdate(id, req.body);

            res.status(200).json({
                message: "The book has been updated successfully",
            });
        } catch (error) {
            next(error);
        }
    }
    static async deleteBookById(req, res, next) {
        try {
            const id = req.params.id;

            /*.findByIdAndUpdate() -> método do mongoose, se conecta com o banco MongoDb,
             encontrando pelo ID e atualizando o registro. A função precisa do ID e do body da requisão para
             saber o que precisa ser atulizado */
            await book.findByIdAndDelete(id);

            res.status(200).json({
                message: "The book has been deleted successfully",
            });
        } catch (error) {
            next(error);
        }
    }

    static async listBookByPublisher(req, res, next) {
        // req.query -> query string da requisição, para filtrar os livros pelo publisher
        const publisher = req.query.publisher;
        try {
            const booksByPublisher = await book.find({
                publisher: publisher,
            });
            res.status(200).json(booksByPublisher);
        } catch (error) {
            next(error);
        }
    }
}
export default BookController;
1 resposta

Olá, Evelyn. Tudo bem?

No seu código, o middleware está configurado para enviar uma mensagem específica apenas quando ocorre um CastError do Mongoose. No entanto, quando o ID é válido, mas não encontrado, isso não gera um erro CastError, mas sim um retorno null.

Para corrigir isso, você pode adicionar uma verificação no método listBookById para lidar com o caso em que o livro não é encontrado:

static async listBookById(req, res, next) {
    try {
        const id = req.params.id;
        const foundBook = await book.findById(id);
        
        if (!foundBook) {
            return res.status(404).send({
                message: "Book not found",
            });
        }

        res.status(200).json(foundBook);
    } catch (error) {
        next(error);
    }
}

Com essa alteração, se o livro não for encontrado, você receberá uma mensagem de "Book not found" com o status 404, em vez de null. Seria isso?

Espero ter ajudado e bons estudos.

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