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

Dúvida quanto ao carregamento dos módulos

Olá, na parte do carregamento dos módulos com a variável l load , tentei inverter a ordem de carregamento em app e parece-me que as rotas não foram carregadas. Entendi que é por conta de dependências entre os módulos de rota de produtos e conexão com o banco de dados. Porém o que não entendi é: por que routes não carrega? Onde está essa dependência, mencionada pelo instrutor? Não consegui ver .

Código:

/config/express.js

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


module.exports= function () {
  var app = express();
  app.set('views', './app/views');
  app.set('view engine', 'ejs');

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

  return app;
}

/app/routes/produtos.js

module.exports = function(app){
  app.get('/produtos', function(req, res){
    console.log(app.infra.connectionFactory);
    var connection = app.infra.connectionFactory();
    connection.query('select * from produtos', function(err, result){
      if(err) res.send('ERRO: ' + err.message);
      res.render('produtos/lista', {lista: result});
    });
    connection.end();
  });
}

/app.js

var app = require('./config/express')();
var  host = 'localhost',
     port = 3000;



app.listen(port, host, function(){
  console.log('Servidor rodando no servidor ' + host +  ' porta ' +  port);
});

/app/infra/connectionFactory.js

var mysql = require('mysql');
var host = 'localhost',
    user = 'root',
    password = 'admin',
    database = 'casadocodigo_nodejs';

 function createDBConnection(){
  var connection = mysql.createConnection({
    host : host,
    user : user,
    password : password,
    database : database,
  });
  return connection;
}

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

O routes tem uma dependência bem no produtos.js quando ele faz app.infra.connectionFactory() consegue ver que se o produtos.js for carregado antes do connectionFactory ele não vai conseguir encontrar esse módulo?

Oi Wanderson, mas aí que tá! Teoricamente, carregar primeiramente o 'infra ' pra depois carregar o 'routes' não teria problemas, certo? Já que load('infra') não possui dependência de outro módulo. Quando faço da forma que foi mostrado na aula (carregando primeiramente routes e depois infra) , dá certinho (óbvio), mas bem ai onde você falou, na execução de app.infra.connectionFactory(), claramente há uma dependência. Eu estou confuso. Rsrs.

Espera, agora fui eu quem ficou confuso (hahahahahahah). Primeiramente, por que acha que que o routes não está sendo carregado no primeiro exemplo? Você está recebendo algum erro?

Não exatamente um erro. No primeiro exemplo (no que eu inverti a ordem dos loads da aula), a aplicação roda mas quando acesso a rota /produtos (que deveria carregar a view da aula) recebo um Cannot GET /produtos, ou seja, é como se a Promisse não tivesse saído de load(infra) para then(routes) na execução do express-load.

Acabei de fazer um teste com o arquivo /config/express.js e modifiquei o trecho de código

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

para

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

e executou normalmente. Acredito ter sido o argumento errado que passei! =/

Talvez, mas você comparou com o código do curso? Não estava assim lá?

Lembra de marcar o tópico como solucionado quando tiver seu problema resolvido Icaro. Beleza?

Tem mais alguma coisa onde podemos ajudar?

Eu comparei sim. Estava igual. Obrigado. E eu não posso marcar como solução se minha dúvida não foi solucionada rsrsrs.

solução!

Rsrs, pois devia ter deixado em aberto até a gente resolver o problema Icaro.

Acabei de ler o código do express-load e vi uma coisa, a função load é a única que recebe segundos argumentos como o cwd, por isso, se você usar no then ou mesmo no into, ele é ignorado. Era isso?

Opa, era isso sim, Wanderson! Muito obrigado!