Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

[Dúvida] Mensagem de erro não aparece

Como eu faço para ter o autor como um dado obrigatório, do jeito que eu estou fazendo não esta funcionando?

import mongoose from "mongoose";
import { autorSchema } from "./Autor.js";

const livroSchema = new mongoose.Schema({
  id: { type: mongoose.Schema.Types.ObjectId },
  titulo: { type: String, 
    require: [true, "O titulo do livro é obrigatório"]
  },
  editora: { 
    type: String, 
    required: [true, "A editora é obrigatória "]
  },
  preco: { type: Number },
  paginas: { type: Number },
  autor: {
    type: autorSchema,
    required: [true, "O autor é obrigatório"]
  }
}, { versionKey: false });

const livro = mongoose.model("livros", livroSchema);

export default livro;
import mongoose from "mongoose";

// eslint-disable-next-line no-unused-vars
function manipuladorDeErros(erro, req, res, next) {    
  if(erro instanceof mongoose.Error.CastError) {
    res.status(500).json({ message: "Um ou mais dados fornecidos estão incorretos." });
  } else if(erro instanceof mongoose.Error.ValidationError) {
    const mensagensErro = Object.values(erro.errors)
      .map(erro => erro.message)
      .join("; ");

    res.status(400).json({ message: `Os seguintes erros foram encontrados: ${mensagensErro}` });
  } else {
    res.status(500).json({ message: "Erro interno no servidor." });
  }
}

export default manipuladorDeErros;
5 respostas

No teu código, cê botou o "autor" como um subdocumento usando o esquema "autorSchema". Pra fazer ele ser obrigatório, você usou a parada "required" com uma mensagem de erro feita sob medida. Só que parece que essa mensagem de erro não tá aparecendo quando o "autor" não é fornecido.

Uma maneira de consertar isso pode ser dar uma olhada se o erro é do tipo "ValidationError" no seu middleware de tratamento de erros e, se for, mandar de volta a mensagem de erro feita sob medida pro "autor". Dá pra fazer isso assim:

import mongoose from "mongoose";

// eslint-disable-next-line no-unused-vars
function handleErrors(error, req, res, next) {    
  if(error instanceof mongoose.Error.CastError) {
    res.status(500).json({ message: "Algumas informações fornecidas estão erradas." });
  } else if(error instanceof mongoose.Error.ValidationError) {
    const errorMessages = Object.values(error.errors)
      .map(err => err.message)
      .join("; ");

    res.status(400).json({ message: `Rolaram uns erros: ${errorMessages}` });
  } else {
    res.status(500).json({ message: "Erro interno no servidor." });
  }
}

export default handleErrors;

Com essa mexida, o middleware de tratamento de erros vai checar se o erro é do tipo "ValidationError" e, se for, vai mandar de volta a mensagem de erro feita sob medida pro "autor" quando for o caso.

Permanece com o mesmo erro, não consegui entender direito, a mensagem de erro personalizada não aparece na tela quando o autor não é fornecido.

solução!

Oi, Thiago, tudo bem?

No seu modelo de livros, o código para a propriedade autor está diferente do que foi utilizado no vídeo. O seu está assim:

  autor: {
    type: autorSchema,
    required: [true, "O autor é obrigatório"]
  }

Mas tente mudar para o seguinte:

    autor: {
      type: mongoose.Schema.Types.ObjectId,
      ref: "autores",
      required: [true, "O autor é obrigatório"]
    },

Você também deve importar o mongoose no início do arquivo:

import mongoose from "mongoose";

Veja se agora funciona!

E mais um detalhe que notei no seu código, é que para o campo titulo, você escreveu uma propriedade chamada require, mas o correto é required, com "d" no final. Se não estiver escrita corretamente, provavelmente o título tbm não se tornaria obrigatório.

Espero ter ajudado! Qualquer coisa só falar.

Não sou o autor do relato de erro no fórum, mas está dando o mesmo erro que o amigo que postou.

O que acontece, na verdade é que no curso anterior foi nos instruído a criar a model do Autor da seguinte forma:

import mongoose from "mongoose";

const autorSchema = new mongoose.Schema({
  id: { type: mongoose.Schema.Types.ObjectId },
  nome: { 
    type: String, 
    required: [true, "O nome do(a) autor(a) é obrigatório"] 
  },
  nacionalidade: { type: String }
}, {
  versionKey: false
});

const autor = mongoose.model("autores", autorSchema);

export { autor, autorSchema };

o id do Autor está já como type: mongoose.Schema.Types.ObjectId, sendo assim, quando voltamos pro model de Livros utilizado nesse curso está fornecendo um ID como type: String e não está sendo passado o "autorSchema" que foi exportado la na model de Autor pra model de Livro, dando problema na hora de mostrar os erros.

Acredito que deveria ter sido explicado que haviam sido feitas alterações anteriormente nos arquivos, apenas foi modificado e quando pegamos esse curso novo que é continuação direta do outro, veio um monte de modificação sem explicação alguma.

Não consegui fazer o autor ser obrigatório fazendo essas alterações mencionadas pelo professor.

Salve Thiago, sei que o problema ja foi resolvido mas queria salientar algumas coisas.

  • Gostaria de compartilhar um problema semelhante que tive, meu erro customizado na rota livros simplesmente não aparecia, e percebi que era por conta da forma que o método de cadastrar um novo livro havia sido desenvolvido no curso anterior.
  static async cadastrarLivro (req, res) {
    const novoLivro = req.body;
    try {
      const autorEncontrado = await autor.findById(novoLivro.autor);
      const livroCompleto = { ...novoLivro, autor: { ...autorEncontrado._doc }};
      const livroCriado = await livro.create(livroCompleto);
      res.status(201).json({ message: "criado com sucesso", livro: livroCriado });
    } catch (erro) {
      res.status(500).json({ message: `${erro.message} - falha ao cadastrar livro` });
    }
  }
  • Por esse método começar procurando um autor já registrado no corpo da requisição, que não existe, na const autorEncontrado será armazenado o valor null, e por isso nunca vai entrar naquele erro customizado do middleware de erros.
  • Modifiquei o meu código para ficar igual ao dessa aula e deu tudo certo!