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

Problemas no adiciona()

Estou com problema no adiciona e também no listaTodos (do próximo vídeo), ambos aparecem o mesmo erro para mim, não estou encontrando solução... O erro que aparece é este.

Uncaught TypeError: Cannot read property 'transaction' of undefined at adiciona (aprendendo_indexeddb.html:37) at :1:1

Uncaught TypeError: Cannot read property 'transaction' of undefined at listaTodos (aprendendo_indexeddb.html:50) at :1:1

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Aprendendo IndexedDB</title>
</head>
<body>
    <script src="js/app/models/Negociacao.js"></script>
    <script>

        var connection;
        var openRequest = window.indexedDB.open('aluraframe', 7)

        openRequest.onupgradeneeded = e => {

            console.log("Cria ou altera um banco já existente");

            let minhaConnection = e.target.result;
            if(minhaConnection.objectStoreNames.contains('negociacoes')){
                minhaConnection.deleteObjectStore('negociacoes');
            }

                minhaConnection.createObjectStore('negociacoes', {autoIncrement: true});
        }

        openRequest.onsuccess = (e => 
            console.log("Conexão obtida")
        )

        openRequest.onerror = (e =>
            console.log("Conexão náo obtida")
        )

        function adiciona(){
            let transaction = connection.transaction(['negociacoes'],'readwrite');
            let store = transaction.objectStore('negociacoes');
            let negociacao = new Negociacao(new Date(), 200, 1)
            let request = store.add(negociacao);
            request.onsuccess(
                console.log('A negociacão foi inserida.')
            )
            request.onerror(
                console.log('A negociacão não foi inserida.')
            )
        }

        function listaTodos(){
            let transaction = connection.transaction(['negociacoes'], 'readwrite');
            let store = transaction.objectStore('negociacoes');
            let negociacoes = [];

            let cursor = store.openCursor();

            cursor.onsuccess = e => {

            }

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

    </script>
</body>
</html>

Desde já grato pela ajuda

9 respostas

Boa tarde, Matheus! Como vai?

Os erros estão te dizendo que vc está tentando acessar uma propriedade transaction de um objeto que está undefined.

O erro ocorre nas linhas indicadas a seguir:

function adiciona(){
            let transaction = connection.transaction(['negociacoes'],'readwrite'); // aqui
            // código omitido
}

function listaTodos(){
            let transaction = connection.transaction(['negociacoes'], 'readwrite'); // e aqui
            // código omitido
}

Esse erro está acontecendo pq vc cria o objeto connection mas em nenhum momento atribui um valor a ele.

<script>

        var connection;
        // restante do código omitido
</script>

Eu imagino que nos lugares onde vc coloca minhaConnection deveria ser connection.

Grande abraço e bons estudos!

Olá Gabriel, bom dia. Fiz a alteração que você sugeriu, porém não consegui resolver o problema, de toda forma agradeço pela ajuda.

O que está acontecendo agora, Matheus? E como o seu código está? Cole o código e o erro aqui pra que eu possa te ajudar!

Voltei um pouco no código, copiei o do exemplo, mas tá dando um erro ainda.

Uncaught ReferenceError: adiciona is not defined at :1:1 Uncaught ReferenceError: listaTodos is not defined at :1:1

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Aprendendo IndexedDB</title>
</head>
<body>

    <script src="js/app/models/Negociacao.js"></script>

    <script>

        var openRequest = window.indexedDB.open("aluraframe", 10);

        openRequest.onupgradeneeded = function(e) {

        console.log('Cria ou altera um banco já existente');

        var minhaConnection = e.target.result;
        minhaConnection.createObjectStore('negociacoes', { autoIncrement: true });
        };

        openRequest.onsuccess = function(e) {

        console.log('Conexão obtida com sucesso');

        connection = e.target.result;
        };

        openRequest.onerror = function(e) {

        console.log(e.target.error);
        };


        function adiciona() {

            let transaction = connection.transaction(['negociacoes'],'readwrite');

            let store = transaction.objectStore('negociacoes');

            let negociacao = new Negociacao(new Date(), 200, 1);

            let request = store.add(negociacao);

        }

        function listaTodos() {

            let transaction = connection.transaction(['negociacoes'],'readwrite');
            let store = transaction.objectStore('negociacoes');
            let negociacoes = [];
            let cursor = store.openCursor();

            cursor.onsuccess = e => {

                 let atual = e.target.result;

                 if(atual) {

                     let dado = atual.value;

                     negociacoes.push(new Negociacao(dado._data, dado._quantidade, dado._valor));

                     atual.continue();

                 } else { 

                     console.log(negociacoes);
                 }
            };

            cursor.onerror = e => {
                console.log('Error:' + e.target.error.name);
            };
            }
    </script>
</body>
</html>

Opa, Matheus! Mas agora o erro é outro! O seu erro inicial já foi resolvido que era o problema na conexão!

Esse erro que vc está obtendo agora está te avisando que adiciona e listaTodos não estão definidos! Ou seja, em algum lugar do seu código vc está tentando usar essas funções e não está conseguindo. O que me leva a crer que dentro do seu arquivo js/app/models/Negociacao.js em algum momento vc está tentando usar essas duas funções.

Vc poderia colar aqui o conteúdo desse arquivo?

class Negociacao {

    constructor(data, quantidade, valor) {

        this._data = new Date(data.getTime());
        this._quantidade = quantidade;
        this._valor = valor;
        Object.freeze(this);
    }

    get volume() {

        return this._quantidade * this._valor;
    }

    get data() {

        return new Date(this._data.getTime());
    }

    get quantidade() {

        return this._quantidade;
    }

    get valor() {

        return this._valor;
    }
}

Segue o código de Negociacao.js

solução!

Matheus, acabei de pegar os seus dois códigos, abri no navegador e funcionou tudo perfeitamente. Não houve nenhum erro.

Nomeei o primeiro como index.html e o segundo como negociacao.js e não houve o erro que vc indicou! Inclusive o Google Chrome imprimiu no console do painel do desenvolvedor as mensagens:

Cria ou altera um banco já existente
Conexão obtida com sucesso

Tem certeza que vc está fazendo o procedimento correto aí? São somente esses dois arquivos que vc está usando mesmo ou tem algo mais?

Não sei bem o porquê, mas refiz os arquivos e agora foi... Obrigado pela ajuda :)

Devia ser algum cache sendo guardado de arquivo antigo, Matheus!

Sempre que tiver qualquer dúvida não hesite em procurar o pessoal aqui no fórum!

Grande abraço e bons estudos!