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

[Dúvida] Validações não são aplicadas para método PUT

Fazendo alguns testes com as validações criadas através dos Schemas do mongoose, percebi que elas só são aplicadas no cadastro inicial dos itens do DB (usando o método POST). Quando é feita uma alteração de cadastrado (pelo método PUT) informando valores que infringem as regras de validação dos campos, a requisição é acatada e o DB é alterado.

Por exemplo, não é possível cadastrar um novo autor informando o campo "nacionalidade" como "vazio" (devido à validação global que impede campos do tipo String de receberem valores "em branco"). Mas é possível cadastrar um autor sem informar o campo nacionalidade (já que este não é obrigatório) ou mesmo informar uma nacionalidade qualquer e, em seguida, alterar o campo "nacionalidade" para vazio (através de um PUT). A mesma lógica se aplica para os demais campos que possuem algum tipo de validação.

Minha dúvida é: existe alguma forma de aplicar essas validações estabelecidas no Schema também para o método PUT, ou é necessário construir essas mesmas validações "na mão" dentro dos métodos dos Controllers que atuam nas requisições do tipo PUT?

2 respostas
solução!

Olá, Vinícius! Tudo bem?

De fato, as validações definidas nos Schemas do mongoose são aplicadas apenas no momento do cadastro inicial dos itens do banco de dados, utilizando o método POST.

No entanto, é possível aplicar as mesmas validações também para o método PUT, sem a necessidade de construir as validações manualmente nos métodos dos Controllers.

Uma forma de fazer isso é utilizando a opção runValidators ao chamar o método findOneAndUpdate do mongoose. Essa opção faz com que as validações definidas nos Schemas sejam aplicadas durante a atualização dos dados.

Por exemplo, suponha que você tenha um Schema de Autor com a seguinte validação para o campo "nacionalidade":

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

Ao realizar uma requisição PUT para atualizar um autor, você pode utilizar o método findOneAndUpdate com a opção runValidators definida como true, dessa forma:

Autor.findOneAndUpdate({ _id: autorId }, { nacionalidade: "" }, { runValidators: true })
  .then((autor) => {
    // ...
  })
  .catch((error) => {
    // ...
  });

Dessa forma, as validações definidas no Schema serão aplicadas também para o método PUT, garantindo que os campos sejam atualizados conforme as regras estabelecidas.

Espero que essa explicação tenha sido útil! Se tiver mais alguma dúvida, estou à disposição.

Abraços e bons estudos!

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

Muito obrigado pela resposta, Armano!

Excelente! Muito útil esse recurso!