1
resposta

Erro bastante inesperado

Olá! Fiz as aulas 3 e 4 do curso, realizando os testes durante as videoaulas e tudo estava correndo bem até que terminei a aula 4: recebi o erro Uncaught TypeError: Cannot read property '_data' of undefined no arquivo NegociacaoDao.js, que eu mexi na aula 3. Segue o código:

class NegociacaoDao {
  constructor(connection) {
    this._connection = 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 adicionar a negociação');
      }
    });
  }

  listaTodos () {
    return new Promise((resolve, reject) => {
      let cursor = this._connection
        .transaction([this._store], 'readwrite')
        .objectStore(this._store)
        .openCursor();
      let negociacoes = [];
      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 {
          resolve(negociacoes);
        }
      }
      cursor.onerror = e => {
        console.log(e.target.error);
        reject('Não foi possível listar as negociações');
      }
    });
  }

  apagaTodos() {
    return new Promise((resolve, reject) => {
      let request = this._connection
        .transaction([this._store], 'readwrite')
        .objectStore(this._store)
        .clear();
      request.onsuccess = e => resolve('Negociações removidas com sucesso');
      request.onerror = e => {
        console.log(e.target.error);
        reject('Não foi possível remover as negociações');
      };
    });
  }
}

NegociacaoController.js:

class NegociacaoController {
  constructor(){
    let $ = document.querySelector.bind(document);
    this._inputData = $("#data");
    this._inputQuantidade = $("#quantidade");
    this._inputValor = $("#valor");
    this._listaNegociacoes = new Bind(
      new ListaNegociacoes(),
      new NegociacoesView($('#negociacoesView')),
      'adiciona', 'esvazia');
    this._mensagem = new Bind(
      new Mensagem(),
      new MensagemView($('#mensagemView')),
      'texto');
    this._listaNegociacoes = new Bind(
      new ListaNegociacoes(),
      new NegociacoesView($('#negociacoesView')),
      'adiciona', 'esvazia', 'ordena', 'inverteOrdem');
    this._ordemAtual = '';
    this._service = new NegociacaoService();
    this._init();
  }

  _init() {
    this._service
    .lista()
    .then(negociacoes =>
      negociacoes.forEach(negociacao =>
        this._listaNegociacoes.adiciona(negociacao)))
    .catch(erro => this._mensagem.texto = error);

    setInterval(() => {
      this.importaNegociacoes();
    }, 5000);
  }

  adiciona(event) {
    event.preventDefault();
    let negociacao = this._criaNegociacao();
    this._service
      .cadastra(negociacao)
      .then(mensagem =>  {
        this._listaNegociacoes.adiciona(negociacao);
        this._mensagem.texto = mensagem;
        this._limpaFormulario();
      })
      .catch(erro => this._mensagem.texto = erro);
  }

  importaNegociacoes() {
    this._service
    .importa(this._listaNegociacoes.negociacoes)
    .then(negociacoes => {
      negociacoes.forEach(negociacao => this._listaNegociacoes.adiciona(negociacao));
      this._mensagem.texto = 'Negociações do período importadas com sucesso';
    })
    .catch(error => this._mensagem.texto = error);
  }

  apaga() {
    this._service
      .apaga()
      .then(mensagem => {
        this._mensagem.texto = mensagem;
        this._listaNegociacoes.esvazia();
      })
      .catch(erro => this._mensagem.texto = erro);
  }

  _criaNegociacao(){
    return new Negociacao(
      DateHelper.textoParaData(this._inputData.value),
      parseInt(this._inputQuantidade.value),
      parseFloat(this._inputValor.value));
  }

  _limpaFormulario() {
    this._inputData.value ='';
    this._inputQuantidade.value = 1;
    this._inputValor.value = 0.0;
    this._inputData.focus();
  }

  ordena(coluna) {
    if(this._ordemAtual == coluna) {
      this._listaNegociacoes.inverteOrdem();
    } else {
      this._listaNegociacoes.ordena((a, b) => a[coluna] - b[coluna]);
    }
      this._ordemAtual = coluna;
  }
}

Negociação.js:

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;
  }
}

Alguém sabe me dizer o erro? estou disponível para mandar qualquer outo código. Obrigado!

1 resposta

A mensagem é que você ta lendo um dado nulo ou invalido. Considerando que esse dado ta vindo do IndexedDB, acho que deve ter algum dado que foi gravado errado dentro dele e ta corrompendo tua aplicação,

Tenta limpar seu IndexedDB e executar denovo a aplicação.