3
respostas

Explicação alternativa para o conceito

Olá! Não entendi muito bem a lógica por trás do que foi feito. Seria possível uma explicação alternativa?

O que entendi até então:

Em custom-express.js, "chamamos" o express pro nosso projeto da seguinte forma:

const express = require('express');
const app = express();

Daí, permitimos a utilização dele em outros arquivos com esse trecho:

module.exports = app

No server.js chamamos a constante 'app' pelo require:

const app = require('./src/config/custom-express');

O arquivo rotas.js também vai usar 'app', então precisamos chama-lo lá também.

A partir daqui, fiquei perdido. Por que estamos importando rotas.js no custom-express.js (trecho abaixo)?

const rotas = require('../app/rotas/rotas.js');
rotas(app);

Por que quando importamos 'app' em rotas.js o código não funcionou como esperado? Entendi que seria o mesmo raciocínio aplicado em server.js (importar um método que foi definido em custom-express.js)

Em server.js, temos:

const app = require('./src/config/custom-express');

app.listen(3000, function(){
    console.log('rodando express')
})

Isso funciona!

Mas por que se, em rotas, colocarmos da forma abaixo não funciona?

const app = require('./src/config/custom-express');

    app.get('/', function(req, resp) {
        resp.send(
            `
                <html>
                    <head>
                        <meta charset="utf-8">
                    </head>
                    <body>
                        <h1> Casa do Código </h1>
                    </body>
                </html>
            `
        );
    });

    app.get('/livros', function(req, resp) {
        resp.send(
            `
                <html>
                    <head>
                        <meta charset="utf-8">
                    </head>
                    <body>
                        <h1> Listagem </h1>
                    </body>
                </html>
            `
        );
    });
3 respostas

Fala ai Andre, tudo bem? O ideal é fazer através da função rotas(app) para que os módulos não criem uma dependência ciclica, onde o módulo A depende de B e B depende de A.

No seu caso, o rotas está dependendo de custom-express e o custom-express está dependendo de rotas.

Espero ter ajudado.

Oi, Matheus. Obrigado pelo resposta! Ainda não ficou claro pra mim. Talvez minha pergunta não tenha sido clara o suficiente.

Tenho o custom-express.js:

const express = require('express');                                  
const app = express();                  

module.exports = app    

Chamo 'app' aqui no server.js e tudo funciona de boa:

const app = require('./src/config/custom-express');

app.listen(3000, function(){
    console.log('rodando express')
})

Agora, vamos dizer que eu tentasse fazer isso aqui em rotas.js:

const app = require('./src/config/custom-express');

app.get('/', function(req, resp) {
        resp.send(
            `
                <html>
                    <head>
                        <meta charset="utf-8">
                    </head>
                    <body>
                        <h1> Casa do Código </h1>
                    </body>
                </html>
            `
        );
    });

Por que o código de rotas.js não funciona? Com o código desse jeito eu não consigo acessar o diretório '/'.

Agora eu entendi a dúvida Andre, bom, isso era para funcionar, mas, precisa ver como você está fazendo. Eu fiz um exemplo aqui para te passar.

Criei três arquivos: app.js, server.js e routes.js.

Segue o conteúdo de cada um:

// app.js
const express = require('express')
const app = express()

module.exports = app
// routes.js
const app = require('./app')

app.get('/', (req, res) => {
    res.json({ result: 'Some message' })
})

app.get('/another', (req, res) => {
    res.json({ result: 'Another route' })
})
// server.js
const app = require('./app')
require('./routes')

app.listen(8080, () => {
    console.log('Server running at: http://localhost:8080')
})

Veja que o server vai importar tanto o app.js quando o routes.

Espero ter ajudado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software