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

Só carrega uma vez

Atividade 14 Toda vez que eu atualizo a pagina apresenta o seguinte erro

events.js:160
      throw er; // Unhandled 'error' event
      ^

Error: Cannot enqueue Quit after invoking quit.
    at Protocol._validateEnqueue (/home/eglison/Projetos/casadocodigo/node_modules/mysql/lib/protocol/Protocol.js:204:16)
    at Protocol._enqueue (/home/eglison/Projetos/casadocodigo/node_modules/mysql/lib/protocol/Protocol.js:139:13)
    at Protocol.quit (/home/eglison/Projetos/casadocodigo/node_modules/mysql/lib/protocol/Protocol.js:92:23)
    at Connection.end (/home/eglison/Projetos/casadocodigo/node_modules/mysql/lib/Connection.js:249:18)
    at /home/eglison/Projetos/casadocodigo/app/routes/produtos.js:14:20
    at Layer.handle [as handle_request] (/home/eglison/Projetos/casadocodigo/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/eglison/Projetos/casadocodigo/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/home/eglison/Projetos/casadocodigo/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/home/eglison/Projetos/casadocodigo/node_modules/express/lib/router/layer.js:95:5)
    at /home/eglison/Projetos/casadocodigo/node_modules/express/lib/router/index.js:281:22

Para funcionar eu tenho que ficar restartando o nodemon, só acessa a pagina na primeira vez, na segunda ele apresenta esse erro.

5 respostas

Oi Eglison, parece que é problema no código das rodas de produto em casadocodigo/app/routes/produtos.js, cola o código aqui por favor?

module.exports = function (app) {
    var listProduct = function (req, res) {
        var connection = app.infra.connectionFactory;
        var productDAO = new app.infra.ProductDAO(connection);
        productDAO.list(function (error, results) {
            res.format({
                html: function () {
                    res.render('produtos/lista', {list: results});
                },
                json: function () {
                    res.json(results);
                }
            });

        });
       connection.end();
    };

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

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

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

    app.post('/produtos', function (req, res) {
        var product = req.body;

        req.assert('descProduto', 'Descrição é obrigatório.').notEmpty();
        req.assert('valorUnitario', 'Formato inválido.').isFloat();
        req.assert('valorUnitario', 'Valor unitário é obrigatório.').notEmpty();
        req.assert('descMarca', 'Marca obigatoria').notEmpty();
        req.assert('quantidadeProduto', 'Formato inválido.').isInt();
        req.assert('quantidadeProduto', 'Quantidade é obrigatório.').notEmpty();

        var error = req.validationErrors();
        if (error){
            res.format({
                html: function () {
                    res.status(400).render('produtos/form', {errorValidator:error, product:product});
                },
                json: function () {
                    res.status(400).json(error);
                }
            });
            return;
        }

        console.log(product);
        var connection = app.infra.connectionFactory;
        var productDAO = new app.infra.ProductDAO(connection);
        productDAO.save(product, function (error, results) {
            // console.log(error);
            res.redirect('/produtos');
        });
    });

}
solução!

Consegui resolver o problema da conexão eu executei os seguintes passos 1 - alterei o código da connectionFactory, no module.express eu retornei a função dele, e não a execução, veja:

var mysql = require('mysql');

function createDBConnection() {
    return mysql.createConnection({
        host: 'localhost',
        user: 'trab_pw',
        password: '123456',
        database: 'Ecommerce'
    });
}

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

2 - E nas rotas, eu passei a usar os parênteses e colocar o connection.end(); no final

module.exports = function (app) {
    var listProduct = function (req, res) {
        var connection = app.infra.connectionFactory();
        var productDAO = new app.infra.ProductDAO(connection);
        productDAO.list(function (error, results) {
            res.format({
                html: function () {
                    res.render('produtos/lista', {list: results});
                },
                json: function () {
                    res.json(results);
                }
            });
        });
        connection.end();
    };

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

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

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

    app.post('/produtos', function (req, res) {
        var product = req.body;

        req.assert('descProduto', 'Descrição é obrigatório.').notEmpty();
        req.assert('valorUnitario', 'Valor Unitário - Formato inválido.').isFloat();
        req.assert('valorUnitario', 'Valor unitário é obrigatório.').notEmpty();
        req.assert('descMarca', 'Marca obigatoria').notEmpty();
        req.assert('quantidadeProduto', 'Quantidade - Formato inválido.').isInt();
        req.assert('quantidadeProduto', 'Quantidade é obrigatório.').notEmpty();

        var error = req.validationErrors();
        if (error) {
            res.format({
                html: function () {
                    res.status(400).render('produtos/form', {errorValidator: error, product: product});
                },
                json: function () {
                    res.status(400).json(error);
                }
            });
            return;
        }

        console.log(product);
        var connection = app.infra.connectionFactory();
        var productDAO = new app.infra.ProductDAO(connection);
        productDAO.save(product, function (error, results) {
            // console.log(error);
            res.redirect('/produtos');
        });
    });

}

Muito obrigado pela ajuda, já podemos encerrar esse tópico. E eu abri outro tópico falando quase o mesmo assunto, vou marcar como solucionado também.

Entendi, Eglison, mas vi que você duplicou a resposta. Quando isso acontecer novamente, posta só o link de um tópico no outro por que assim a resposta fica em um lugar só, tá bem? E evita criar vários tópicos com o mesmo problema.

Bons estudos!

Ok, desculpe pelo problema, mas nas próximas vezes vou fazer apenas um tópico.