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

Erro function is not defined

Arquivo dbConnectionFactory.js

var mysql = require('mysql');

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

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

Fonte produto.js

module.exports = function(app){
        app.get('/produtos',(req,res)=>{

        var connection = app.infra.dbConnectionFactory().createDBConnection();
        connection.query('select * from livros', (err, results)=>{
            res.render('produtos/lista',{lista:results});
        });

        connection.end();

    });

}

Arquivo express.js

var express = require('express');
var load = require('express-load');



module.exports = function(){
    var app = express();
    app.set('view engine', 'ejs');
    app.set('views','./app/views');
    load('routes',{cwd:'app'}).then('infra').into(app);
    return app;
}

Arquivo app.js

var express = require('express');
var load = require('express-load');

module.exports = function(){
    var app = express();
    app.set('view engine', 'ejs');
    app.set('views','./app/views');
    load('routes',{cwd:'app'}).then('infra').into(app);
    return app;
}

Estou executando a app mas estou recebendo o erro, já revisei várias vezes mas não consegui identificar o problema, alguem consegue me ajudar. Obrigado

TypeError: app.infra.dbConnectionFactory is not a function
    at app.get (C:\Projetos\node\casadocodigo\app\routes\produtos.js:6:30)
    at Layer.handle [as handle_request] (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\layer.js:95:5)
    at C:\Projetos\node\casadocodigo\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\index.js:275:10)
    at expressInit (C:\Projetos\node\casadocodigo\node_modules\express\lib\middleware\init.js:40:5)
    at Layer.handle [as handle_request] (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\layer.js:95:5)
9 respostas

Oi Elton, o erro diz que seu dbConnectionFactory não é uma função, e não é mesmo, é um arquivo, lembra? Esse arquivo vai ser carregado como uma propriedade do objeto infra. Então você acessa ele assim:

var connection = app.infra.dbConnectionFactory.createDBConnection();

Testa pra gente?

Então obrigado pela resposta, fiz o que foi descrito mas o erro continua.

produto.js

module.exports = function(app){
        app.get('/produtos',(req,res)=>{

        var connection = app.infra.dbConnectionFactory.createDBConnection();
        connection.query('select * from livros', (err, results)=>{
            res.render('produtos/lista',{lista:results});
        });

        connection.end();

    });

}

Ocorreu o mesmo problema:

TypeError: app.infra.dbConnectionFactory.createDBConnection is not a function
    at app.get (C:\Projetos\node\casadocodigo\app\routes\produtos.js:6:50)
    at Layer.handle [as handle_request] (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\layer.js:95:5)
    at C:\Projetos\node\casadocodigo\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\index.js:275:10)
    at expressInit (C:\Projetos\node\casadocodigo\node_modules\express\lib\middleware\init.js:40:5)
    at Layer.handle [as handle_request] (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\layer.js:95:5)

Será que o problema não está no meu arquivo express que não está carregando os módulos dentro da pasta app/infra/dbConnectionFactory ?

Arquivo express.js

var express = require('express');
var load = require('express-load');



module.exports = function(){
    var app = express();
    app.set('view engine', 'ejs');
    app.set('views','./app/views');
    load('routes',{cwd:'app'}).then('infra').into(app);
    return app;
}

Elton, desculpa mas vendo novamente, você só precisa dessa linha:

app.infra.dbConnectionFactory();

Ela já deve retornar a conexão feita.

Olá Wanderson, obrigado pela ajuda. Coloquei a linha descrita acima, mas o mesmo problema ocorreu.

produto.js

module.exports = function(app){
        app.get('/produtos',(req,res)=>{

        var connection = app.infra.dbConnectionFactory();
        connection.query('select * from livros', (err, results)=>{
            res.render('produtos/lista',{lista:results});
        });

        connection.end();

    });

}

Erro no navegador, o problema deve ser uma coisa bem tosca mas não estou enxegando.

TypeError: app.infra.dbConnectionFactory is not a function
    at app.get (C:\Projetos\node\casadocodigo\app\routes\produtos.js:6:30)
    at Layer.handle [as handle_request] (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\layer.js:95:5)
    at C:\Projetos\node\casadocodigo\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\index.js:275:10)
    at expressInit (C:\Projetos\node\casadocodigo\node_modules\express\lib\middleware\init.js:40:5)
    at Layer.handle [as handle_request] (C:\Projetos\node\casadocodigo\node_modules\express\lib\router\layer.js:95:5)

Elton, tem como você me disponibilizar seu projeto pra que eu veja isso mais de perto? Você pode criar um zip e colocar no driver ou no dropbox por exemplo se não souber usar o github.

Ai você coloca o link aqui.

Olá Wanderson, posso sim coloco no dropbox https://www.dropbox.com/sh/1echpyfg6n1x3v5/AABoCdqj6FXn3YtkXhezDBVxa?dl=0

Coloquei ali, dá uma olhada se consegue baixar. Mas voi também começar o projeto do zero. Obrigado.

Opa Elton, tudo bem? Verifiquei aqui e notei que se fizer apenas:

var connection = app.infra.dbConnectionFactory;

Já funciona. Isso por que no module.exports você já retorna a execução da função. Me parece que por baixo dos panos o load executa a função do module.exports direto, entende?

Por isso você está recebendo esse erro. Ele já executa a função do module.exports que executa a função que retorna a conexão já pronta.

Testa pra ver?

Opá, funcionou perfeitamente, acho que entendi quando eu faço o wrapper de uma função e exporto ela, o node quando chama esse módulo ele já chama em forma de uma função. Ou seja quando eu uso o módulo app.infra.dbConnectionFactory ele já chama a função com a conexão como banco. Acho que é isso. Me corrija se eu estiver errado. Muito obrigado pelo ajuda amigo.

solução!

Está certo sim amigo! Ele executa o que estiver no module.exports. Isso faz parte do projeto de leitura.

Lembra de marcar como solução o post que resolveu o problema, tá bem? Mais alguma dúvida?