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

Falso Alerta de Erro.

Ao realizar a validação com express validator eu recebo como erro os campos que estão preenchidos, fazendo com que seja exibido na tela um falso alerta de erro. O que estou fazendo errado?

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('factory')
        .then('database')
        .into(app);

    return app;
};
module.exports = function(app) {

    var listarProdutos = function(req, res) {

        var connection = app.factory.connectionFactory();
        var produtoDAO = new app.database.produtoDAO(connection);

        produtoDAO.lista(function(err, result) {

            if (err) {
                console.log("Erro ao salvar o produto");
                return;
            }

            res.render('produtos/lista', { lista: result ? result : [] });
        });

        connection.end();
    };

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

    app.get('/produtos/cadastro', function(req, res) {
        res.render("produtos/cadastro", { errosParams: [], produto: {} });
    });

    app.post('/produtos/salva', function(req, res) {

        var produto = req.body;
        req.assert('titulo', 'Titulo é obrigatório').notEmpty();
        req.assert('preco', 'Formato inválido').isFloat();
        var erros = req.validationErrors();

        console.log(erros);
        if (erros) {
            res.render('produtos/cadastro', { errosParams: erros, produto: produto });
            return;
        }

        var connection = app.factory.connectionFactory();
        var produtoDAO = new app.database.produtoDAO(connection);

        produtoDAO.salva(produto, function(err, result) {

            if (err) {
                console.log("Erro ao salvar o produto");
                res.render('produtos/cadastro');
                return;
            }

            res.format({
                html: function() {
                    res.redirect('/produtos/cadastro', { errosParams: [], produto: {} });
                },
                json: function() {
                    res.json(result);
                }
            });
        });
    });
};
<!DOCTYPE html>
<html>
<head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Cadastro de Livros</title>

        <!-- Bootstrap CSS -->
        <link href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">

        <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
        <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
        <!--[if lt IE 9]>
            <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
            <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
        <![endif]-->
</head>

<body class="container">

    <h1 class="text-center">Cadastro de livros</h1>
    <div class="erros">    
        <% if(errosParams) {%>            
            <%for(i=0; i < errosParams.length; i++) {%>
                <div class="alert alert-danger alert-dismissible col-sm-offset-2 col-sm-10" role="alert"><strong><%=errosParams[i].param %></strong> - <%=errosParams[i].msg %>
                    <a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
                </div>
            <% } %>
       <% } %>        
    </div>

<form class="form-horizontal" action="/produtos/salva" method="post">

  <div class="form-group">
    <label for="titulo" class="col-sm-2 control-label">Título</label>
    <div class="col-sm-10">
      <input type="text" class="form-control" id="titulo" value="<%produto.titulo%>" placeholder="Insira o titulo">
    </div>
  </div>

  <div class="form-group">
    <label for="preco" class="col-sm-2 control-label">Preço</label>
    <div class="col-sm-10">
      <input type="text" class="form-control" id="preco" placeholder="Insira o preço" value="<%produto.preco%>" min="0.01" step="0.01" value="0.0">
    </div>
  </div>

  <div class="form-group">
    <label for="descricao" class="col-sm-2 control-label">Descrição</label>
    <div class="col-sm-10">
      <textarea class="form-control" id="descricao" rows="3" placeholder="Fale sobre o livro"><%produto.descricao%></textarea>
    </div>
  </div>

  <div class="form-group">
    <div class="col-sm-offset-2 col-sm-10">
      <button type="submit" class="btn btn-primary btn-lg">Gravar</button>
    </div>
  </div>

</form>
        <!-- jQuery -->
        <script src="//code.jquery.com/jquery.js"></script>
        <!-- Bootstrap JavaScript -->
        <script src="//netdna.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
  </body>

</html>
2 respostas
solução!

Boa tarde!

Você não preencheu o atributo name dos inputs. Ele que é usado para gerar o atributo do objeto JSON.

Também nos values, você não colocou o igual na expressão: <%=produto.titulo%>

Abc!

Boa noite Wesley Egberto.

Obrigado, era exatamente isso :)