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

Não consigo impedir que a conexão seja fechada

Estou fazendo o curso de Javascript Avançado III, e estou com um problema.

var ConnectionFactory = (function(){

    const stores = ['negociacoes'];
    const version = 7;
    const dbName = 'aluraframe';

    let conexao =  null;
    let close = null;

    return class ConnectionFactory {

        constructor () {

            throw new Error ('Não é possível criar instancias da classe ConnectionFactory');
        }

        static getConnection() {

            return new Promise ((resolve, reject) => {

                var openRequest = window.indexedDB.open(dbName, version);

                openRequest.onupgradeneeded = e => {
                    ConnectionFactory._createStores(e.target.result);
                };

                openRequest.onsuccess = e => {
                    if(!conexao) { 
                        conexao = e.target.result;
                        close = conexao.close.bind(conexao);
                        conexao.close(() => {
                            throw new Error('Não é possível fechar a conexão com o banco')
                        });
                    }
                    resolve(conexao);
                };

                openRequest.onerror = e => {
                    console.log(e.target.error);
                    reject(e.target.error.name);
                };
            });
        }

        static _createStores (conexao) {
            stores.forEach(store => {
                if(conexao.objectStoreNames.contains(store))
                    conexao.deleteObjectStore(store);
                conexao.createObjectStore(store,{autoIncrement: true});
            });
        }

        static closeConnection() {
            if(conexao) {
                close();
                conexao = null;
                close = null;
             }
        }
    }
})();

Ao avançar mais um pouco no curso, foi preciso listar e adicionar negociações no banco e encontrei o erro abaixo:

Uncaught (in promise) DOMException: Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing.

    at Promise (http://localhost:3000/js/app/dao/NegociacaoDao.js:30:18)
    at NegociacaoDao.listarTodos (http://localhost:3000/js/app/dao/NegociacaoDao.js:27:16)
    at NegociacaoController.ConnectionFactory.getConnection.then.then.dao (http://localhost:3000/js/app/controllers/NegociacaoController.js:24:30)

Comparando o código com o feito na aula, aparentemente está igual. O que posso fazer pra solucionar o problema?

6 respostas

Opa, só uma curiosidade.. era para chamar aquele método close() na connection mesmo? Pq vc acaba de abrir e já ta fechando na sequência.

Sim, segundo a aula é exatamente isso. O metódo close() está dentro de CloseConnection() e só é disparado quando chamado ele é chamado.

Link do projeto no Dropxbox

Nesse link tem o projeto todo, talvez o erro esteja em outro arquivo...

Agradeço desde já

Você escreveu um código diferente do que mostro no vídeo, inclusive na explicação.

Para para que você fique fera o assunto, vou indicar a linha e me diz se consegue enxergar o problema:

conexao.close(() => {
                            throw new Error('Não é possível fechar a conexão com o banco')
                        });

Não sei se há outros problemas, mas esse me saltou aos olhos rapidamente. Vamos por esse primeiro.

O Alberto deu uma dica! Ele viu algo estranho nessa instrução. Vou dar a minha: você não fez monkey patch, algo que deveria ser feito.

Oi Darlan, conseguiu descobrir? Qualquer coisa, só me falar que a gente recapitula essa questão.

solução!

Oi Darlan, alterando seu código para ficar igual ao que ensinei ele deve estar assim:

conexao.close = () => {
       throw new Error('Não é possível fechar a conexão com o banco')
};

Muito obrigado! Me passou despercebido esse detalhe do Monkey Patch e acabei confundindo com a sintaxe de uma Arrow Function.