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

app.shared.connectionFactory is not a function

Ao invés de chamar de 'infra' coloquei o nome de shared... Segue o repo do projoeto no meu github: https://github.com/lgmf/alura-nodejs-products/blob/master/README.md

Poderia dar uma olhada?

7 respostas

Olá, Luiz!

Achei bacana que você usou arrow functions. O código fica mais simples, né?

A organização do código ficou ótimo também!

Uma coisa que acho que pode ser mudada é o nome controllers em app.shared.controllers.productsDB.

Um controller é o cara que faz o "meio de campo" entre a view e o resto do sistema (o model).

Se você notar, que interage com a view no seu caso são as rotas, que chamam o res.render().

Então, eu chamaria o diretório onde estão os .js que acessam o Banco de Dados de db ou dao.

Então, ficaria algo como app.shared.db.productsDB ou app.shared.dao.productsDB.

solução!

Sobre o erro app.shared.connectionFactory is not a function, duas coisas:

  • Como você chamou o arquivo de connectionFactory.1.js, com um .1 no final, você precisa usar esse número lá no routes/products.js:
    let dbConnection = app.shared.connectionFactory1();
  • Lá no shared/connectionFactory.1.js, você havia colocado return createDBConnection();, já chamando a função. Precisamos passar a função e não o resultado da chamada da função. Então, fica assim:
    module.exports = () => {
      return createDBConnection;
    }

Vai ocorrer um erro na conexão com o Banco de Dados.

Em routes/products.js, vale colocar algo para logar o erro:

db.list(dbConnection, function (erros, resultados) {
    console.error(erros); //inserido
    res.render('products/products-list/list', { lista: resultados });
});

Você precisa ajustar o host, user, password e database lá no connectionFactory.1.js.

Muito obrigado pelas dicas!. Vou alterar.

Com relação ao connectionFactory.1.js eu só uso ele pra subir no github e nao ficar minhas informaçoes do banco de dados, mas na real no projeto eu uso o connectionFactory.js que está no meu gitignore.

Com relação a isso module.exports = () => { return createDBConnection(); }

Esse código está na descrição do curso e eu peguei de lá, porém ja fiz uma solicitação de alteração.

Mais um vez obrigado

Com relação ao connectionFactory.1.js eu só uso ele pra subir no github e nao ficar minhas informaçoes do banco de dados, mas na real no projeto eu uso o connectionFactory.js que está no meu gitignore.

Ah, legal! Boa estratégia!

O pessoal costuma a usar variáveis de ambiente para poder sobreescrever em

let createDBConnection = () => {
    return mysql.createConnection({
        host: process.env.MYSQL_HOST || 'localhost',
        user: process.env.MYSQL_USER || 'root',
        password: process.env.MYSQL_PWD || '',
        database: process.env.MYSQL_DB || 'casadocodigo_nodejs'
    });
}

Se você chamar node app, vão ficar os valores padrão.

Para sobreescrever os valores você pode definir variáveis de ambiente. Ou até logo no comando:

MYSQL_DB=xpto_db node app

O banco de dados no comando acima seria sobreescrito.

Bem bacana a estratégia de utilizar as variáveis de ambiente do Node. Mas daí toda hora que for executar a API vou precisar escrever o comendo

 set MYSQL_HOST ='localhot', 
 set MYSQL_USER = ' root'
...
nodemon app.js

?

Com relação à de baixo não entendi muito bem... é um arquivo que contem os dados?

Você pode setar as variáveis de ambiente uma vez e, enquanto continuar na mesma sessão do terminal, as variáveis de ambiente continuarão valendo.

Você pode colocar direto no sistema operacional (p. ex. no .bashrc no Ubuntu). A cada novo terminal, as variáveis valerão.

Num Linux, você pode setar as variáveis em um arquivo, que o povo em geral chama de .env. Dentro do arquivo as variáveis tem que ter export (p. ex. export MYSQL_DB=xpto_db. Aí, você entra no terminal e faz source .env. As variáveis de ambiente serão carregadas do arquivo.

Várias possibilidades.


A de baixo seria o MYSQL_DB=xpto_db node app?

Estou setando a variável MYSQL_DB com o valor xpto_db e chamando a aplicação, tudo na mesma linha!