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

var connection = app.infra.connectionFactory;

Eu não estou conseguindo usar o seguinte trecho de código var connection = app.infra.connectionFactory(); para que funcione tudo certo, eu tenho que fazer uma pequena alteração var connection = app.infra.connectionFactory; veja no final, eu removi os '()'

6 respostas

Oi Eglison, usar o parênteses ou não, depende de como você usa o module.exports, você poderia mostrar como está? E também como você tá usando o connectionFactory?

connectionFactory.js

var mysql = require('mysql');

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

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

express.js

var express = require('express');//carregando o express de modo global
var load = require('express-load');
var bodyParser = require('body-parser');
var expressValidator = require('express-validator');

module.exports = function () {
    var app = express();
    app.set('view engine', 'ejs');//dizendo qual é o motor de views
    app.set('views', './app/views');//ensinando para o express que as views está dentro da pasta app

    app.use(bodyParser.urlencoded({extended: true}));//aplicar funcões ao req, na ordem definida
    app.use(bodyParser.json());
    app.use(expressValidator());

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

Eu carrego a infraestrutura do projeto no express.js

Na listagem de produtos, eu tive que tirar o connection.end(); pois se eu o deixasse a listagem de produtos é feito, porem, quando eu atualizava a página (F5) a mesma não era exibida, e só voltava a exibir se eu reiniciar o servidor, sem o conncection.end(); posso atualizar quantas vezes eu quiser que funcionaa

veja o produtos.js

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();
    };
[...]
}

Vi por que você precisou remover os parênteses. Dentro do module.exports, você não está retornando a função, mas sim a execução dela. Então faz sentido sim remover os parênteses. Tem uma forma mais simples. Simplesmente retornar a função createDBConnection sem executá-la, dessa forma você não precisaria usar uma função anônima. Mas tudo bem.

Em relação a atualização da página, pode estar acontecendo um problema de assincronia. A conexão pode estar sendo encerrada antes mesmo do productDAO.list executar completamente, por isso o problema. A dica é por o connection.end no final do productDAO.list (dentro, mas no final, depois do res.format). Isso deve resolver e você não vai ter uma conexão aberta pra sempre.

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();
    };

Já estou colocando o connection.end(); no final

eu coloquei na ultima linha, antes de fechar a conexão.

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.