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

JSON não é exibido e produto não salva: Cannot POST /produtos/salva

Apos instalar o body-parser o JSON não é exibido. Continua aparecendendo a mensagem Cannot POST /produtos/salva

module.exports = function(app){

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

        produtosBanco.lista(function(erros,resultados){
            res.render('produtos/lista',{lista:resultados});
        });
        connection.end();
    });

    app.get('/produtos/form',function(req,res){

        //var produto = req.body;
        //console.log(produto);

        //var connection = app.infra.connectionFactory();
        //var produtosBanco = new app.infra.ProdutosDAO(connection); 
        res.render('produtos/form');

    });

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

        var produto = req.body;
        console.log(produto);

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

ProdutosDAO.prototype.lista = function(callback){
    this._connection.query('select * from livros', callback);
}

ProdutosDAO.prototype.salva = function(produto,callback){
    this._connection.query('insert into produtos set ?',produto,callback);
}

module.exports = function(){
    return ProdutosDAO;
}
<html>
    <body>
        <form action="/produtos/salva" method="post">

            <div>
                <label for="titulo">Titulo</label>
                <input type="text" id="titulo" name="titulo" placeholder="coloque o titulo"/>
            </div>
            <div>
                <label for="preco">Preço</label>
                <input type="text" id="preco" name="preco" placeholder="150.25"/>
            </div>
            <div>
                <label for="descricao">Descrição</label>
                <textarea cols="20" rows="10"  id="descricao" name="descricao" placeholder="fale sobre o livro"></textarea>
            </div>

            <input type="submit" value="salva"/>
        </form>
    </body>
</html>
var express = require('express');
var load = require('express-load');
var bodyParser = require('body-parser');

module.exports = function() {

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

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


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

    return app;
};
2 respostas
solução!

Pelo código que você mostrou, o que ocorre é que não existem rotas que aceitem POST, todas as suas rotas estão como GET

app.get('/produtos',function(req,res){ (...) });
 app.get('/produtos/form',function(req,res){(...)});
 app.get('/produtos/salva',function(req,res){(...)});

Precisa alterar a rota de produtos/salva de GET para POST

Foi um erro bobo! Valeu.