2
respostas

Não consigo executar o adiciona

Olá Flávio, fiz o adiciona dentro do NegociacaoDao, mas quando chamo no console dá um erro:

ConnectionFactory.getConnection().then(connection => new NegociacaoDao(connection).adiciona(new Negociacao(new Date(), 7, 100))); Promise {} NegociacaoDao.js:11 Uncaught (in promise) TypeError: Cannot read property 'transaction' of undefined at Promise (NegociacaoDao.js:11) at new Promise () at NegociacaoDao.adiciona (NegociacaoDao.js:9) at ConnectionFactory.getConnection.then.connection (:1:84)

segue o ConnectionFactory e o NegociacaoDao

em tempo, instânciei os dois no index.html

var ConnectionFactory = (function () { //criando uma função auto invocada, vai ser carregada e executada
    const store      = ['negociacoes'];  //nome da tabela
    const version    = 5;
    const dbName     = 'aluraframe';
    var connection = null;
    var close      = null;

    //const não pode reatribuir valor;

    return class ConnectionFactory {

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

        }

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

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

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

                openRequest.onsuccess = e => {
                    if (!connection) {
                        connection = e.target.result;
                        close = connection.close.bind(connection); 
                        connection.close = function() {
                            throw new Error("Você não pode fechar diretamente a conexão");
                        };
                    }    
                    resolve(connection);
                };

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

        static _createStores(connection) {
            stores.forEach(store => {
                if (connection.objectStoreNames.contains(store)) connection.deleteObjectStore(store);
                connection.createObjectStore(store, { autoIncrement: true });  // primeiro cria o banco e dps a tablea ou objectstore
            });
        }

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

})();



class NegociacaoDao{ 

    constructor(connection) {
        this._connnection = connection;
        this._store = 'negociacoes';
    }

    adiciona(negociacao) {
        return new Promise((resolve, reject) => {
            let request = this._connection
                .transaction([this._store], 'readwrite') 
                .objectStore(this._store) 
                .add(negociacao); 

            request.onsuccess = e => {
                resolve();
            };

            request.onerror = e => {
                console.log(e.target.error);
                reject('Não foi possível negociar a negociação');
            };
        });

    }
}
2 respostas

Me parece que o atributo _connection da classe NegociacaoDao está vindo como indefinido. Olhando seu código não consegui achar onde vcs inicializa uma nova conexão.

Na factory vc tem o método getConnection que utiliza uma variável connection mas em nenhum momento você declarou essa variável.

Dentro da classe ConnectionFactory nós temos:

connection = e.target.result;

que está no onsuccess do open da conexão

a primeira vez que ele passa ali o connection está vazio verificado através do if