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

Não recebo mensagem de aviso !

Eu estou um pouco diferente dá aula, onde tem /produtos eu fiz um botão que vai para o form, mais quando eu tento salvar sem titulo em vez de dar o erro, ele salva.

app.get('/produtos/form', function(req,res){
        res.render('produtos/form',{errosValidacao:{}, produto:{}});

    });

    app.post('/produtos', 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();
        if(erros){
            res.render('produtos/form',{errosValidacao:erros,produto:produto});
            return;
        }

form :

<html>
    <body>
        <div class="erros">
            <%if(errosValidacao){%>
                <ul>
                    <%for(var i=0;i<errosValidacao.length;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" id="titulo" value="<%=produto.titulo%> "name="titulo" placeholder="Coloque o titulo">
            </div>
                <label for="preco">Preço</label>
                <input type="text" id="preco" value="<%=produto.preco%>"name="preco" placeholder="150.5">
            <div>
                <label for="descricao">Titulo</label>
                <textarea cols="20" rows="10" id="descricao "name="descricao" placeholder="Coloque uma descrição"><%=produto.descricao%></textarea>
            </div>

            <input type="submit" value="Salvar" />
        </form>
    </body>
</html>

e aqui é onde eu puis o " adicionar "

<html>
    <body>
        <table>
            <tr>
                <td>id</td>
                <td>titulo</td>
                <td>descricao</td>
                <td>preco</td>
                <td>Ação</td>
            </tr>
            <%for(var i=0;i<lista.length;i++) {%>
                <tr>
                    <td><%=lista[i].id%></td>
                    <td><%=lista[i].titulo%></td>
                    <td><%=lista[i].descricao%></td>
                    <td><%=lista[i].preco%></td>
                    <td>
                        <form action="/produtos?_method=DELETE" method="post">
                            <input type="hidden" name="id" value="<%= lista[i].id %>" />
                            <input type="submit" value="Apagar" />
                        </form>
                    </td>
                </tr>
            <%}%>
        </table>
        <tr>
                <form action="/produtos/form" method="get">
                    <input type="submit" value="Adicionar" />
                </form>
            </tr>
    </body>
</html>

desde já agradeço muuuuito

6 respostas

Luiz, não achei nenhum erro no seu código. Você pode mandar o arquivo de configuração do seu express e o código completo da rota /produtos com o method POST?

Config :

var express = require('express');
var load = require('express-load');
var bodyParser = require('body-parser');
var methodOverride = require('method-override');
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(expressValidator());

    app.use(methodOverride('_method'));

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

    return app;
}

produtos

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

        produtosDAO.lista(function(errors,results){
            res.render('produtos/lista',{lista:results}); 
        });

        connection.end();       
    }
    app.get('/produtos',listaProdutos);

    app.get('/produtos/form', function(req,res){
        res.render('produtos/form',{errosValidacao:{}, produto:{}});

    });

    app.post('/produtos', 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();
        if(erros){
            res.render('produtos/form',{errosValidacao:erros,produto:produto});
            return;
        }

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

    });

    app.delete('/produtos', function(req,res){
        var connection = app.infra.connectionFactory();
        var produtosDAO = new app.infra.ProdutosDAO(connection);

        var id = req.body.id;
        produtosDAO.remove(id, function(err, results){
            if(err){
                console.log(err);
            }
            res.redirect('/produtos');
        });

        connection.end();
    });    

}

Alguém poderia me ajudar ?

solução!

Boa tarde Luiz,

Coloquei o seu código aqui no meu ambiente e esta linha é que está com problema.

<input type="text" id="titulo" value="<%=produto.titulo%> " name="titulo" placeholder="Coloque o titulo">

Tem um espaço na tag "value", o express-validator entende que este campo não está vazio.

Valeu amigo !

Por nada.

Bons estudos.