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

Listando os produtos após o salvamento

Boa noite, conseguem me ajudar ?? A minha aplicação não esta gravando no banco de dados, e não consigo identificar o problema.

insira seu código aqui
insira seu código aqui
//app.js

// estes comandos foram transferidos para o arquivos express.js
//var express = require('express');
//var app = express();
//app.set('view engine', 'ejs');

//depois de implementado o arquivo express.js fica assim
var v_app = require ('./config/express')();

//código transferido para o arquivo ./app/routes/produtos.js
//app.get('/produtos', function (req, res) {
//res.send("<html><body><h1>Listagem de produtos</h1></body></html>") //tranferido para o arquivo ./views/produtos/lista.ejs
//    console.log("atendendo a requisicao");
//    res.render("produtos/lista");
//});

//depois de implementado o arquivo produtos.js fica assim
//var rotasProdutos = require('./app/routes/produtos')(v_app);
//esta linha saiu porque a rota passou a ser carregada no arquivo /config/express

v_app.listen(3000, function () {
    console.log("servidor rodando na porta 3000");

});

------------------------------
//./config/express

//assim sempre vai carregar a o express com uma nova versão
//module.exports = function () {
//    console.log("modulo ta sendo carregado");
//    var app = require('express')();
//    app.set('view engine', 'ejs');
//    return app;
//};

// ou assim carrega apenas uma vez a versão do express
var v_express = require('express');
var v_load = require('express-load');
var bodyParser = require('body-parser');

module.exports = function () {

    console.log("modulo ta sendo carregado");

    var v_app = v_express();

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

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

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

    return v_app;
};

------------------------------
package.json
{
  "name": "casadocodigo",
  "version": "1.0.0",
  "description": "Site da Casa do Código - Feito pelo Cacá",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Caca",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.17.1",
    "ejs": "^2.3.3",
    "express": "^4.15.2",
    "express-load": "^1.1.15",
    "mysql": "^2.13.0"
  }
}

------------------------------
<!-- app\views\produtos\lista.ejs -->
<html>
    <body>
        <table>
            <tr>
                <td>id</td>
                <td>titulo</td>
                <td>descricao</td>
                <td>preco</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>
                </tr>
            <%}%>
            <tr>
            </tr>
        </table>
     <!--    
        <form "/produtos/form" method="post">
            <input name="clicou" id="clicou" type="submit" value="Novo Produto"/>
        </form>
    -->        
    </body>
</html>

------------------------------
// ./app/infra/connectionFactory.js
var v_mysql = require('mysql');

//module.exports = function (v_app) {
//    return v_mysql.createConnection({
//        host : 'LocalHost',
//        user : 'root',
//        password : 'Mrlf0101',
//        database : 'casadocodigo_nodejs'
//    });

function createDBConnection() {
    return v_mysql.createConnection({
        host: 'localhost',
        user: 'root',
        password : '',
        database: 'casadocodigo_nodejs'
    });
}

module.exports = function () {
    return createDBConnection;
};
------------------------------

// ./app/routes/produtos.js

//var v_connectionFactory = require('../infra/connectionFactory');
//este carregamento não é mais necessário, pois a coneção foi carregada no arquivo /config/express

module.exports = function (v_app) {

    console.log("atendendo a requisicao");
    var v_listaProdutos = function(req, res) {
        var v_connection = v_app.infra.connectionFactory();
        var v_produtosDAO = new v_app.infra.ProdutosDAO(v_connection);

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

        v_connection.end();
    };

    v_app.get('/produtos', v_listaProdutos);

    v_app.get('produtos/remove', function () {
        var v_connection = app.infra.connectionFactory();
        var v_produtosDAO = new app.infra.ProdutosDAO(v_connection);
        var v_produto = v_produtosDAO.carrega(id, callback);
        if (v_produto) {
            v_produtosBanco.remove(v_produto, callback);
        }
    });

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


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

        var v_produto = req.body;

        console.log(v_produto);

        var v_connection = v_app.infra.connectionFactory();
        var v_produtosDAO = new v_app.infra.ProdutosDAO(v_connection);

        v_produtosDAO.salva(v_produto, function (err, results) {
            //v_listaProdutos(req, res);
            res.redirect('/produtos');
        });

        v_connection.end();
    });
};

------------------------------
 // app\infra\produtosDAO.js

//module.exports = function () {
//    return function (v_connection) {
//        this.lista = function (callback) {
//            v_connection.query('select * from produtos', callback);
//        };//

        //this.remove = function (callback) {
        //    v_connection.query('select * from produtos', callback);
        //};

//        console.log(this);
//        return this;
//    };
//};

function ProdutosDAO(p_connection) {
    this._v_connection = p_connection;
}

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

ProdutosDAO.prototype.salva = function (p_produto, callback) {
    this._v_connection.query('insert into produtos set ?', p_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="Gravar"/>
        </form>
    </body>
</html>
5 respostas

Oi Luis, tudo bem? Tenta fazer um zip do seu projeto e disponibilizar aqui pra mim ver, por que do jeito que está, com essa quantidade de código comentada, fica complicado saber como seu projeto realmente está e onde o problema está acontecendo.

Tá aparecendo alguma mensagem de erro? O seu banco de dados está funcionando? Seu app tava funcionando e depois parou por algum motivo? Zipa tudo e deixa um link aqui pra mim baixar e testar, assim talvez eu possa chegar no problema mais rápido.

Se você está listando os dados já existentes e não consegue adicionar novos, o problema é na rota que faz a gravação. Precisa exibir as mensagens de erro.

Faça o seguinte ajuste:


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

        var v_produto = req.body;

       //Para conferir os dados enviados pelo formulario!
        console.log(v_produto);

        var v_connection = v_app.infra.connectionFactory();
        var v_produtosDAO = new v_app.infra.ProdutosDAO(v_connection);

        v_produtosDAO.salva(v_produto, function (err, results) {
            //Exibindo a mensagem de erro no terminal!
            if (err){
                console.log(err);
            }
            //v_listaProdutos(req, res);
            res.redirect('/produtos');
        });

        v_connection.end();
    });

Não aparece mensagem alguma, o banco esta funcionando corretamente porque estou conseguindo fazer select na tabela, pelo comando de prompt.

https://drive.google.com/file/d/0Bz3kioMtzeWpdXlPekQxdG1CTnc/view?usp=sharing

Resolvido.....obrigado.....

lr_donadeli@CacaDonadeli ~/Caca_raiz/Caca/Alura/Node/AppNode/casadocodigo $ node app.js modulo ta sendo carregado atendendo a requisicao atendendo a requisicao servidor rodando na porta 3000 { titulo: 'teste de numero 4', preco: '150,25', descricao: 'teste de numero 4' } { Error: ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect decimal value: '150,25' for column 'preco' at row 1 at Query.Sequence._packetToError (/home/lr_donadeli/Caca_raiz/Caca/Alura/Node/AppNode/casadocodigo/node_modules/mysql/lib/protocol/sequences/Sequence.js:52:14) at Query.ErrorPacket (/home/lr_donadeli/Caca_raiz/Caca/Alura/Node/AppNode/casadocodigo/node_modules/mysql/lib/protocol/sequences/Query.js:77:18) at Protocol._parsePacket (/home/lr_donadeli/Caca_raiz/Caca/Alura/Node/AppNode/casadocodigo/node_modules/mysql/lib/protocol/Protocol.js:280:23) at Parser.write (/home/lr_donadeli/Caca_raiz/Caca/Alura/Node/AppNode/casadocodigo/node_modules/mysql/lib/protocol/Parser.js:75:12) at Protocol.write (/home/lr_donadeli/Caca_raiz/Caca/Alura/Node/AppNode/casadocodigo/node_modules/mysql/lib/protocol/Protocol.js:39:16) at Socket. (/home/lr_donadeli/Caca_raiz/Caca/Alura/Node/AppNode/casadocodigo/node_modules/mysql/lib/Connection.js:103:28) at emitOne (events.js:96:13) at Socket.emit (events.js:191:7) at readableAddChunk (_stream_readable.js:178:18)

at Socket.Readable.push (_stream_readable.js:136:10)

at Protocol._enqueue (/home/lr_donadeli/Caca_raiz/Caca/Alura/Node/AppNode/casadocodigo/node_modules/mysql/lib/protocol/Protocol.js:141:48) at Connection.query (/home/lr_donadeli/Caca_raiz/Caca/Alura/Node/AppNode/casadocodigo/node_modules/mysql/lib/Connection.js:208:25) at ProdutosDAO.salva (/home/lr_donadeli/Caca_raiz/Caca/Alura/Node/AppNode/casadocodigo/app/infra/ProdutosDAO.js:27:24) at /home/lr_donadeli/Caca_raiz/Caca/Alura/Node/AppNode/casadocodigo/app/routes/produtos.js:52:23 at Layer.handle [as handle_request] (/home/lr_donadeli/Caca_raiz/Caca/Alura/Node/AppNode/casadocodigo/node_modules/express/lib/router/layer.js:95:5) at next (/home/lr_donadeli/Caca_raiz/Caca/Alura/Node/AppNode/casadocodigo/node_modules/express/lib/router/route.js:137:13) at Route.dispatch (/home/lr_donadeli/Caca_raiz/Caca/Alura/Node/AppNode/casadocodigo/node_modules/express/lib/router/route.js:112:3) at Layer.handle [as handle_request] (/home/lr_donadeli/Caca_raiz/Caca/Alura/Node/AppNode/casadocodigo/node_modules/express/lib/router/layer.js:95:5) at /home/lr_donadeli/Caca_raiz/Caca/Alura/Node/AppNode/casadocodigo/node_modules/express/lib/router/index.js:281:22 at Function.process_params (/home/lr_donadeli/Caca_raiz/Caca/Alura/Node/AppNode/casadocodigo/node_modules/express/lib/router/index.js:335:12) code: 'ER_TRUNCATED_WRONG_VALUE_FOR_FIELD', errno: 1366, sqlState: 'HY000', index: 0 } { titulo: 'teste de numero 4', preco: '150.25', descricao: 'teste de numero 4' }

solução!

Luis, compartilha a solução aqui, se foi um dos posts que ajudou a resolver, marca o post como solução, tá bem? Obrigado! =)