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

Servidor iniciando antes do banco de dados

Eu fiz o seguinte código e percebi que o servidor é iniciado antes do banco de dados:

database.js

const conexao = require('../app/infraestrutura/conexao')

const Tabelas = require('../app/infraestrutura/tabelas')
const tabelas = new Tabelas()

module.exports = () => {
    return new Promise((resolve, reject) => {
        conexao.connect(erro => {
            if(erro) {
                return reject(console.log(erro))
            }           
            return resolve(
                // tabelas.init(conexao)
                console.log('conectado com sucesso'))
        })
    })
}

index.js

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

let server;

database()
    .then(server = app.listen(3000, () => {
        console.log('Servidor rodando na porta 3000')
    }))
    .catch(erro => console.log(erro))

module.exports = server

O que poderia fazer para que o banco fosse inicializado antes do servidor?

4 respostas

eu não se seria a melhor opção,mas você poderia fazer um middleware ou um async e await, pois as informações do bd demora um pouco mais pra chegar-lá

solução!

Olá Edilson, tudo bem com você?

Acredito que a melhor maneira de conseguir ter esse comportamento seria passando uma função para o then

Então ao invés de apenas atribuir como você está fazendo:

database()
    .then(server = app.listen(3000, () => {
        console.log('Servidor rodando na porta 3000')
    }))

Vamos passar uma função para fazer essa atribuição, da seguinte maneira:

database()
    .then(() => server = app.listen(3000, () => console.log("Servidor Iniciado")))
    .catch(error => console.log(error)) 

Dessa forma só iremos executar o servidor quando o database estiver conectado corretamente :)

Abraços e Bons Estudos!

Geovani, a sua solução funcionou, muito obrigado. A minha dúvida agora é porque eu tive que passar essa função para que funcionasse da maneira correta?

Opa Edilson, desculpe a demora :)

Isso acontece porque o then de uma promise é por definição uma função de retorno, então quando você apenas atribuiu um valor, ele executou instantaneamente essa atribuição e por consequência a função para iniciar o servidor antes de terminar o resultado da função anterior, quando passamos a função ele espera terminar a execução para depois iniciar a próxima :)

Compreendeu?

Vou te dar um exemplo:

(function main() {

    let atribuindo = 3;

    Promise.resolve()
        .then( () => console.log("Resultado 1"))
        .then( () => console.log("Valor de:"+ atribuindo))
        .then(atribuindo = 5)
})()

Se executarmos esse código, o segundo then irá printar: Valor de 5, isso porque passamos uma atribuição ao invés de uma função de retorno, caso mudemos para () => atribuindo = 5) ai teremos o comportamento esperado de mostrar na tela Valor de 3 e só depois fazer a atribuição :)

Abraços e Bons Estudos!

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