Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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!