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

Não consigo fechar a conexão

não aparece nenhum erro no meu editor, apenas três avisos, apliquei a mudança do Sidi nesse tópico, funcionou corretamente, mas se eu executo o código no console duas vezes ele dá um erro.

É esse o código:

ConnectionFactory.getConnection().then(connection => console.log(connection));

E esse o erro:

ConnectionFactory.js:19 Uncaught (in promise) ReferenceError: resolver is not defined
    at ConnectionFactory.js:19
    at new Promise (<anonymous>)
    at Function.getConnection (ConnectionFactory.js:17)
    at <anonymous>:1:1

Quando uso closeConnection() ele me retorna um outro erro.

Uncaught Error: Utilize ConnectionFactory.closeConnection() para fechar a conexão
    at IDBDatabase.connection.close (ConnectionFactory.js:35)
    at Function.closeConnection (ConnectionFactory.js:53)
    at <anonymous>:1:19

Eu dei uma olhada no meu código, procurei, procurei e não consegui achar o erro.

classe ConnectionFactory:

var ConnectionFactory = (function () {
    const stores = ['negociacoes'];
    const version = 1;
    const dbName = 'aluraframe';

    var connection = null;
    var close = null;

    return class ConnectionFactory {

        constructor() {
            throw new Error('Não é possível criar instâncias de ConnectionFactory')
        }

        static getConnection() {

            return new Promise((resolve, reject) => {
                if (connection) {
                    resolver(connection);
                    return;
                }

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

                openRequest.onupgradeneeded = e => {
                    ConnectionFactory._createStores(e.target.result);
                    console.log('Upgrade DB...');

                }
                openRequest.onsuccess = e => {

                    connection = e.target.result;
                    close = connection.close.bind(connection);
                    connection.close = () => {
                        throw new Error('Utilize ConnectionFactory.closeConnection() para fechar a conexão');
                    }
                    resolve(connection);

                }
                openRequest.onerror = e => {
                    console.log(e.target.error);
                    reject(e.target.error.name);
                }
            });
        }
        static _createStores(connection) {
            if (connection.objectStoreNames.contains('store'))
                connection.deleteObjectStore('store');
            connection.createObjectStore('store', { autoIncrement: true });
        }
        static closeConnection() {
            if (connection) {
                connection.close();
                connection = null;
            }
        }
    }
})();

Sobre os avisos, dizem que a const 'store' não está sendo usada e a var 'close' também não. Alguém pode me ajudar por favor?

8 respostas
solução!

Boa tarde Lucas,

Seguinte, de que maneira você está testando essa conexão?

Você informou que está dando erro nesta linha:

ConnectionFactory.getConnection().then(connection => console.log(connection));

Mas a minha pergunta é aonde você está colocando esta linha?

Eu copiei o código que você disponibilizou do ConnectionFactory e tentei executar a linha onde você informa ocorrer o erro, aqui para mim rodou sem nenhum problema. Eu testei em um arquivo HTML em branco, somente com a estrutura e criei uma tag script para mim poder fazer os testes.

Analisando o seu código eu vejo alguns erros, o método de fechar a conexão está com problemas...

Lá no seu método você está fazendo assim:

static closeConnection() {
    if (connection) {
        connection.close();
        connection = null;
    }
}

Note que você está fazendo connection.close(), no entanto no seu método getConnection() você está sobscrevendo esse cara. Olhe o seguinte trecho de código que você tem, eu coloquei um comentário para você identificar

static getConnection() {
    return new Promise((resolve, reject) => {
        // código

        openRequest.onsuccess = e => {
            connection = e.target.result;

            // AQUI VOCÊ ESTÁ ATRIBUINDO O MÉTODO CLOSE DA CONNECTION PARA UMA VARIAVEL close QUE VOCÊ CRIOU
            close = connection.close.bind(connection);

            // AQUI VOCÊ ESTÁ SOBSCREVENDO O MÉTODO
            connection.close = () => {
                throw new Error('Utilize ConnectionFactory.closeConnection() para fechar a conexão');
            }
            resolve(connection);
        } 

        // código
    });
}

Então, no seu método closeConnection você deve chamar essa váriavel close que você criou e vinculou o método close da connection. Ficando dessa forma:

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

Outro erro que notei também, foi no método _createStores, você está fazendo passando o valor 'store', no caso você está passando uma string e não a váriavel, você deve passar a sua váriavel declarada como stores. Você deve alterar para ficar assim:

static _createStores(connection) {
    if (connection.objectStoreNames.contains(stores))
        connection.deleteObjectStore(stores);
    connection.createObjectStore(stores, { autoIncrement: true });
}

Espero ter ajudado,

Bons estudos

Boa noite Édson, esse trecho.

ConnectionFactory.getConnection().then(connection => console.log(connection));

Esse trecho eu use no console do navegador mesmo, pelo o que eu entendi da aula, é pra sobescrever a API, apliquei sua mudança e funcionou direitinho, quanto ao método _createStore, ele não aparecia erro com a string, mas o aviso sumiu mudando o código. Tá funcionando direitinho cara, vlw :)

Porém ainda tem um erro no console.

ConnectionFactory.js:19 Uncaught (in promise) ReferenceError: resolver is not defined
    at ConnectionFactory.js:19
    at new Promise (<anonymous>)
    at Function.getConnection (ConnectionFactory.js:17)
    at <anonymous>:1:1

Sabe dizer o que é esse erro?

Ah, entendi. Você estava testando direto no console hehe.

A questão do _createStore ele não ira acusar nenhum erro mesmo, pois como ele aceita uma string ele executa de boas, mas a questão é que ali você cria as suas stores, então se você passa somente uma string como você estava fazendo 'store' vai ser criado somente uma store no indexdb. Então de uma maneira mais legível é criado um array de strings e nesse array é passado todos os stores que você deseja criar.

Você cria esse array na linha 2

const stores = ['negociacoes'];

Aí basta você passas esse array lá no método _createStore que ele irá criar todas as stores que estiver nesse array.

Esse erro que está ocorrendo acontece pois la no método getConnection você está criando uma Promisse e seta dois parâmetros, sendo eles o resolve e o reject, no entanto se você ver a linha 19 na qual está acusando o erro você está tentando executar o método resolver, mas esse método não existe, pois o certo é resolve conforme você declarou como parâmetro.

Segue o trecho de código comentado


static getConnection() {
    return new Promise((resolve, reject) => {
        if (connection) {
              // AQUI VOCÊ DEVE COLOCAR resolve(connection) E NÃO resolver(connection)
            resolve(connection);
            return;
        }

        // código
    });
}

Caraca, era uma coisa tão pequena, eu tava olhando pra linha 19 pensando nessa palavra e eu ainda ignorei e fui continuar fazendo as outras aulas e não percebi que tinha errado uma unica letrinha, isso mostra que devo ser mais atencioso, isso deve ser cansaço de JavaScript, fiquei de manha até de noite programando. Obrigado pela ajuda cara.

Cara, tem um erro que fica aparecendo, mas não tá na pasta cliente e sim na pasta server, eu procurei esse arquivo que aponta no erro, mas não achei, tem alguns erros que tenho que concertar ainda, mas boa parte do site funciona normalmente, o problema tá nesse arquivo da pasta server mesmo, um tal de content.js

Olha só o erro:

content.js:34 Uncaught TypeError: imgs.imgSRC_o.replace is not a function
    at Object.getImages (content.js:34)
    at Object.find (content.js:47)
    at m_over (content.js:113)
getImages @ content.js:34
find @ content.js:47
m_over @ content.js:113

Sabe dizer o que é? :)

heheheheh é assim mesmo Lucas, às vezes acontece uns erro que a gente fica procurando e procurando e não encontramos, aí chega uma outra pessoa e nota que o erro é apenas uma única letra, um único valor, uma coisa bem besta mesmo. Por isso que às vezes quando você tem um problema é bom pedir ajuda para outro, pois outras pessaos vão notar coisas que você não nota por estar acostumado aquela lógica que você criou.

Cara, referente a esse outro erro que está dando, não sei ao certo o que pode ser pois aqui está funcionando sem nenhum problema. Tenta entrar na pasta server e apagar a pasta node_modules. Abre o terminal do seu SO e entra no caminho da pasta server e executa o comando npm install pois ai ele vai instalar todas as depêndencias de novo. Aí depois tenta rodar o projeto e vê se o erro persiste.

re-instalei os módulos e não deu em nada, continua o erro :/

aqui o código no PasteBin

Bom dia Lucas, Realmente não sei o que pode ser esse erro. Esse erro é de um arquivo de alguma lib né?

Mas infelizmente não sei o que pode ser, pois em nenhum momento esse erro aconteceu comigo =x

Sim, e acontece com os 3 navegadores que eu tenho aqui, mas como tá funcionando tudo ok então isso não parece ser tão importante, só queria resolver mesmo ele. Obrigado pela atenção cara :)