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

bodyParser vazio

Boa tarde! Meu problema é simples, ao tentar puxar o conteudo do formulário, para o bodyParser, ele está vindo vazio. Em seguida, teoricamente eu enviaria pro banco.

Coloquei um console.log() logo embaixo do produto receber o req.body;, e após preencher o formulário e enviar, é impresso no console apenas: {} Estou interpretando como um JSON vazio, e não consigo enxergar o porque de estar vazio.

Segue códigos:

produto.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(err,results) {
            res.render('produtos/lista',{lista:results});
        });
        connection.end();
    }

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

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

    app.post('/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) {
            listaProdutos(req,res);
        });
    });
}

ProdutosDAO.js

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 livros set ?',produto,callback);
}

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

express.js

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;
}
6 respostas

Oi Adryan, não consegui enxergar o erro :(. Tem como liberar o código no github?

Somos 2 Alberto. Diz sobre liberar o projeto inteiro lá?

isso :). Que aí baixo aqui, rodo e consigo olhar melhor :).

Perfeito! Acabo de criar e commitar, aguardo ajuda, rs.

https://github.com/dygonn/node-help

solução!

Opa, o problema ta na view. Você usou o id em vez do name nos inputs.

Perfeito! Funcionou sem problemas. Muito obrigado pela ajuda professor, gostaria de parabenizar pela agilidade no apoio aqui, estou gostando muito do curso.

Para futuras pessoas com o mesmo problema, aqui vai a alteração do código:

app/views/produtos/form.ejs (ANTES)

<html>
    <body>
        <form action="/produtos/salva" method="post">
            <div>
                <label for="titulo">Titulo</label>
                <input type="text" id="titulo" placeholder="coloque o titulo"/>
            </div>
            <div>
                <label for="preco">Preço</label>
                <input type="text" id="preco" placeholder="10.99"/>
            </div>
            <div>
                <label for="descricao">Descrição</label>
                <textarea cols="30" rows="5" id="descricao" placeholder="fale sobre o livro"></textarea>
            </div>

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

app/views/produtos/form.ejs (DEPOIS) - Funcionando.

<html>
    <body>
        <form action="/produtos/salva" method="post">
            <div>
                <label for="titulo">Titulo</label>
                <input type="text" name="titulo" placeholder="coloque o titulo"/>
            </div>
            <div>
                <label for="preco">Preço</label>
                <input type="text" name="preco" placeholder="10.99"/>
            </div>
            <div>
                <label for="descricao">Descrição</label>
                <textarea cols="30" rows="5" name="descricao" placeholder="fale sobre o livro"></textarea>
            </div>

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