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

Mensagem de erro de validação não aprece

Olá, não estou conseguindo fazer com a mensagem de erro apareça para o usuário.

Não esta gravando no banco então quer dizer que a validação esta funcionado.

express.js

var express = require('express');
var load = require('express-load');
var bodyParser = require('body-parser');
var expressValidator = require('express-validator');

module.exports = function(){
  var app = express();

  app.set('view engine','ejs');
  app.set('views','./app/views');

  app.use(bodyParser.urlencoded({extended: true}));
  app.use(bodyParser.json());
  app.use(expressValidator());

  load('routes', {cwd: 'app'})
      .then('infra')
      .into(app);

  return app;
}

produtos.js

module.exports = function(app){

  var listaProdutos = function(req,res){
    var connection = app.infra.connectionFactory();
    var ProdutosDAO = new app.infra.ProdutosDAO(connection);

    ProdutosDAO.lista(function(erros,resultados){
      res.format({
        html: function(){
          res.render('produtos/lista',{lista:resultados});
        },
        json: function(){
          res.json(resultados);
        }
      });
    });
    connection.end();
  }

  app.get('/produtos', listaProdutos);

  app.get('/produtos/form',function(req,res){
    res.render('produtos/form',{errosValidacao:{}});
  });
  app.post('/produtos',function(req,res){
    var livro = req.body;

    req.assert('titulo','Titulo é obrigatório').notEmpty();
    req.assert('preco','Formato inválido').isFloat();

    var erros = req.validationErrors();
    if(erros){
        res.render('produtos/form',{errosValidacao:erros});
        return;
    }

    var connection = app.infra.connectionFactory();
    var ProdutosDAO = new app.infra.ProdutosDAO(connection);
    ProdutosDAO.salva(livro,function(erros,resultados){
      res.redirect('/produtos');
    });
  });
}

form.ejs

<!DOCTYPE html>
<html lang="pt-BR">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Formulario</title>
</head>
<body>
  <div class='erros'>
     <%if(errosValidacao){%>
        <ul>
            <%for(var i=0;i<errosValidacao.legth;i++){%>
                <li><%=errosValidacao[i].param%> - <%=errosValidacao[i].msg%></li>
            <%}%>
        </ul>
     <%}%>
</div>
  <form action="/produtos" method="post">
    <div>
      <label for="titulo">Titulo</label>
      <input type="text" name="titulo" placeholder="Coloque o titulo do livro" id="titulo">
    </div>
    <div>
      <label for="preco">Preço</label>
      <input type="text" name="preco" placeholder="Coloque o preco do livro 150.25" id="preco">
    </div>
    <div>
      <label for="descricao">Descrição</label>
      <textarea name="descricao" id="descricao" rows="8" cols="40" placeholder="Coloque aqui a descricao do livro"></textarea>
    </div>
    <div>
      <input type="submit" value="gravar">
    </div>
  </form>
</body>
</html>
2 respostas

Oi Henrique, tudo bem? Que versão do express-validator você está utilizando? Olhei na documentação do express-validator e o método validationErrors está para ser removido do pacote, em vez dele, você terá que usar o eq.getValidationResult()

experimente dar uma olhada na documentação. Bons estudos!

https://github.com/ctavan/express-validator#result-api

solução!

Tem um erro na view. Tente fazer da seguinte forma:

<div class='erros'>
    <%if(errosValidacao){%>
        <ul>
            <%for(var i=0;i<errosValidacao.length;i++){%>
                <li><%=errosValidacao[i].param%> - <%=errosValidacao[i].msg%></li>
            <%}%>
        </ul>
     <%}%>
</div>

A variável "errosValidacao" está sendo enviada do Controller para a View, mas, como ela é um array, na hora de iterar não deve estar funcionando por causa do "legth", o correto é "length"