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

Erro com o storage

Meu storage não funciona, dá erro quando carregar a tela de cadastro. Acredito que o problema seja com o Storage mesmo...

O erro que recebo é o seuginte:

Uncaught (in promise): Error: No available storage method found.
Error: No available storage method found.
    at http://localhost:8100/build/vendor.js:113412:25
    at t.invoke (http://localhost:8100/build/polyfills.js:3:14356)
    at Object.onInvoke (http://localhost:8100/build/vendor.js:4247:33)
    at t.invoke (http://localhost:8100/build/polyfills.js:3:14296)
    at r.run (http://localhost:8100/build/polyfills.js:3:9523)
    at http://localhost:8100/build/polyfills.js:3:19622
    at t.invokeTask (http://localhost:8100/build/polyfills.js:3:15040)
    at Object.onInvokeTask (http://localhost:8100/build/vendor.js:4238:33)
    at t.invokeTask (http://localhost:8100/build/polyfills.js:3:14961)
    at r.runTask (http://localhost:8100/build/polyfills.js:3:10214)

Cadastro.ts

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams, AlertController, Alert } from 'ionic-angular';
import { Carro } from '../../models/Carro';
import { AgendamentosServiceProvider } from '../../providers/agendamentos-service/agendamentos-service';
import { HomePage } from '../home/home';
import { Agendamento } from '../../models/Agendamento';
import { Storage } from '@ionic/storage';
import { Observable } from 'rxjs/Observable';

/**
 * Generated class for the CadastroPage page.
 *
 * See https://ionicframework.com/docs/components/#navigation for more info on
 * Ionic pages and navigation.
 */

@IonicPage()
@Component({
  selector: 'page-cadastro',
  templateUrl: 'cadastro.html',
})
export class CadastroPage 
{
    public carro: Carro;
    public precoTotal: number;
    private _alerta: Alert;

    // Atributos do formulário
    public nome: string = '';
    public endereco: string = '';
    public email: string = '';
    public data: string = new Date().toISOString();

    constructor(public navCtrl: NavController, 
        public navParams: NavParams, 
        private _agendamentosService: AgendamentosServiceProvider, 
        private _alertCtrl: AlertController,
        private _storage: Storage) 
    {
        this.carro = this.navParams.get('carroSelecionado');
        this.precoTotal = this.navParams.get('precoTotal');
    }

    agenda()
    {
        if (!this.nome || !this.endereco || !this.email)
        {
            this._alertCtrl.create({
                title: 'Preenchimento obrigatório',
                subTitle: 'Preencha todos os campos!',
                buttons: [
                    { text: 'OK' }
                ]
            })
            .present();

            return;
        }

        this._alerta = this._alertCtrl.create({
            title: 'Aviso',
            buttons: [
                { 
                    text: 'OK',
                    handler: () => { // handler serve para dizer ao botão o que fazer quando for clicado
                        this.navCtrl.setRoot(HomePage);
                    }
                }
            ]
        });

        let agendamento: Agendamento = {
            nomeCliente: this.nome,
            enderecoClilente: this.endereco,
            emailCliente: this.email,
            modeloCarro: this.carro.nome,
            precoTotal: this.precoTotal,
            enviado: false,
            confirmado: false
        };
        let mensagem = '';

        this._agendamentosService.agenda(agendamento)
            .mergeMap( // esse método vai juntar o Observable de resposta do método agenda do _agendamentosService com o Observable do método salva
                () => this.salva(agendamento)
            )
            .finally(
                () => {
                    this._alerta.setSubTitle(mensagem);
                    this._alerta.present();
                }
            )
            .subscribe(
                () => {
                    mensagem = 'Agendamento deu certo';
                },
                () => {
                    mensagem = 'Houve um erro no agendamento';
                }
            ); 
    }

    salva(agendamento)
    {
        let chave = this.email + this.data.substr(0,10);
        let promise = this._storage.set(chave, agendamento);

        // Para usar o Observable do RxJS e não a Promise do JS
        return Observable.fromPromise(promise);
    }
}
26 respostas

Boa tarde, José! Como vai?

Vc configurou o IonicStorageModule no módulo principal da aplicação src/app/app.module.ts?

Cola o código desse arquivo aqui para que eu possa dar uma olhada e te ajudar!

Grande abraço, meu aluno!

Boa tarde Gabriel, configurei sim.

import { BrowserModule } from '@angular/platform-browser';
import { ErrorHandler, NgModule } from '@angular/core';
import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
import { SplashScreen } from '@ionic-native/splash-screen';
import { StatusBar } from '@ionic-native/status-bar';

import { MyApp } from './app.component';
import { HomePage } from '../pages/home/home';
import { HttpClientModule } from '@angular/common/http';
import { CarrosServiceProvider } from '../providers/carros-service/carros-service';
import { EscolhaPage } from '../pages/escolha/escolha';
import { AgendamentosServiceProvider } from '../providers/agendamentos-service/agendamentos-service';
import { IonicStorageModule } from '@ionic/storage'; // Para poder usar o storage do navegador como banco de dados

// Para poder usar o finally quando faz requisição HTTP
import 'rxjs/add/operator/finally';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/mergeMap';
import 'rxjs/add/observable/fromPromise';

@NgModule({
  declarations: [
    MyApp,
    HomePage,
    // EscolhaPage
  ],
  imports: [
    BrowserModule,
    IonicModule.forRoot(MyApp),
    HttpClientModule,
    IonicStorageModule.forRoot({ name: 'aluracar', storeName: 'agendamentos', driverOrder: ['idexeddb'] }) // Configuração do storage do Ionic
  ],
  bootstrap: [IonicApp],
  // páginas que eu quero navegar devem estar inseridos aqui
  entryComponents: [
    MyApp,
    HomePage,
    // EscolhaPage
  ],
  providers: [
    StatusBar,
    SplashScreen,
    { provide: ErrorHandler, useClass: IonicErrorHandler },
    CarrosServiceProvider,
    AgendamentosServiceProvider
  ]
})
export class AppModule {}
solução!

José, repare que vc ao configurar o IonicModuleStorage escreveu indexeddb incorretamente faltando uma letra n.

IonicStorageModule.forRoot({ name: 'aluracar', storeName: 'agendamentos', driverOrder: ['idexeddb'] })

O correto seria:

IonicStorageModule.forRoot({ name: 'aluracar', storeName: 'agendamentos', driverOrder: ['indexeddb'] })

Faça essa alteração e veja se funciona!

Alguma novidade, José? O problema era realmente isso que eu falei e foi resolvido?

Eu estou com o mesmo erro. Ele abre o app normalmente no navegador. Quando altero qq coisa no projeto com ele executando, aparece este mesmo erro.

Uncaught (in promise): Error: No available storage method found.
Error: No available storage method found.
    at http://localhost:8100/build/vendor.js:113412:25

Boa noite, Tiago! Como vai?

O processo é o mesmo que foi com o José!

Vc configurou o IonicStorageModule no módulo principal da aplicação src/app/app.module.ts?

Cola o código desse arquivo aqui para que eu possa dar uma olhada e te ajudar!

Grande abraço, meu aluno!

import { BrowserModule } from '@angular/platform-browser';
import { ErrorHandler, NgModule } from '@angular/core';
import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
import { SplashScreen } from '@ionic-native/splash-screen';
import { StatusBar } from '@ionic-native/status-bar';
import { GoogleMaps } from '@ionic-native/google-maps';
import { Geolocation } from '@ionic-native/geolocation';

import { TabsPage } from '../pages/tabs/tabs';
import { MyApp } from './app.component';
import { HomePage } from '../pages/home/home';
import { IonicStorageModule } from '@ionic/storage'; 
import { SobrePage } from '../pages/sobre/sobre';
import { MapaPage } from '../pages/mapa/mapa';

@NgModule({
  declarations: [
    MyApp,
    HomePage, 
    TabsPage,
    SobrePage,
    MapaPage
  ],
  imports: [
    BrowserModule,
    IonicModule.forRoot(MyApp),
    IonicStorageModule.forRoot({name: 'ATMDAI',storeName: 'meulocal',driverOrder: ['indexeddb'] })
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
    HomePage, 
    TabsPage, 
    SobrePage,
    MapaPage
  ],
  providers: [
    StatusBar,
    SplashScreen,
    {provide: ErrorHandler, useClass: IonicErrorHandler},
    GoogleMaps, 
    Geolocation,
  ]
})
export class AppModule {}

Pode ser que seja a Ionic CLI se enrolando! Já experimentou parar a execução e iniciar ela novamente?

Sim ja fiz isso várias vezes

Erro do console.

core.js:1350 ERROR Error: Uncaught (in promise): Error: No available storage method found.
Error: No available storage method found.
    at localforage.js:2247
    at t.invoke (polyfills.js:3)
    at Object.onInvoke (core.js:4629)
    at t.invoke (polyfills.js:3)
    at r.run (polyfills.js:3)
    at polyfills.js:3
    at t.invokeTask (polyfills.js:3)
    at Object.onInvokeTask (core.js:4620)
    at t.invokeTask (polyfills.js:3)
    at r.runTask (polyfills.js:3)
    at localforage.js:2247
    at t.invoke (polyfills.js:3)
    at Object.onInvoke (core.js:4629)
    at t.invoke (polyfills.js:3)
    at r.run (polyfills.js:3)
    at polyfills.js:3
    at t.invokeTask (polyfills.js:3)
    at Object.onInvokeTask (core.js:4620)
    at t.invokeTask (polyfills.js:3)
    at r.runTask (polyfills.js:3)
    at c (polyfills.js:3)
    at c (polyfills.js:3)
    at polyfills.js:3
    at t.invokeTask (polyfills.js:3)
    at Object.onInvokeTask (core.js:4620)
    at t.invokeTask (polyfills.js:3)
    at r.runTask (polyfills.js:3)
    at o (polyfills.js:3)
    at e.invokeTask [as invoke] (polyfills.js:3)
    at p (polyfills.js:2)

Tiago, em que momento esse erro acontece? Que arquivo vc está alterando quando dá esse erro? Poste o conteúdo dele aqui.

Outra coisa, dentro da pasta do seu projeto execute o comando ionic info e poste o resultado aqui tbm.

ionic info

cli packages: (/usr/local/lib/node_modules)

    @ionic/cli-utils  : 1.19.1
    ionic (Ionic CLI) : 3.19.1

global packages:

    cordova (Cordova CLI) : 8.0.0

local packages:

    @ionic/app-scripts : 3.1.8
    Cordova Platforms  : ios 4.5.4
    Ionic Framework    : ionic-angular 3.9.2

System:

    Android SDK Tools : 26.1.1
    ios-deploy        : 1.9.2
    Node              : v8.9.4
    npm               : 5.6.0
    OS                : macOS Sierra
    Xcode             : Xcode 9.2 Build version 9C40b

Environment Variables:

    ANDROID_HOME : /Users/Library/Android/sdk

Misc:

    backend : pro

O erro ocorre quando altero qq arquivo e esta rodando no navegador. Quando abre a primeira vez o app nao da erro. Mas quando altero um html e ele da o rebuild aparece o erro

Só ocorre ao alterar um HTML? Se alterar arquivos TS ou SCSS tudo continua funcionando numa boa?

Qualquer arquivo

Criei um projeto do zero e so coloquei a geolocalizacao e storage para salvar e ocorre o mesmo erro.

Confere se dentro da pasta do seu projeto vc tem a pasta node_modules/@ionic/storage.

Tiago, outra coisa a ser observada é que vc está utilizando o node na versão 8.x. Como eu disse durante o curso, a melhor versão do node é a 6.x para utilizar com o Ionic 3.x.

Eu tive problemas com a versão 8.x por isso fiz a indicação.

Sugiro que vc remova a versão 8.x e trabalhe com a versão 6.x.

Grande abraço!

Ok, Gabriel vou mudar a versao. Uma coisa que eu fiz, foi criar dois projetos, um do tipo blank e outro tabs

O de tabs da erro e o blank nao ocorre.

Gabriel eu instalei a versao 6 do node e criei um novo projeto do tabs e funcionou sem erro.

Muito obrigado

Que bom que foi resolvido, Tiago!

Sempre que precisar é só recorrer ao fórum!

Grande abraço e bons estudos!

hehehee, do nada comecou o erro novamente...

Posso enviar o projeto para vc avaliar?

Oi, Tiago! Faz o seguinte: abre um novo tópico aqui no fórum e coloca o seu código num repositório para que eu possa acessar e dar uma olhada.

Tiago, eu estava tendo problemas com isso.

Buildava o projeto e tudo ocorria bem, porém era só trocar um tag HTML por outra, e dava erro e o server caia.

Pesquisando em fóruns do Ionic e do Angular, resolvi o problema executando o seguinte comando:

     npm install ws@3.3.2 --save-dev --save-exact

Não me aprofundei no que essa lib faz, mas instalei essa versão exata e o erro não ocorreu mais.

Abraçoç

Eu tentei este comando, mas nao funcionou..

Tiago, abra um novo tópico com o seu problema e compartilhando o link do repositório com o código pra eu poder dar uma olhada!

Grande abraço!