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

A pasta AluraCar-Webservice sempre cai e apresenta erro

Quando vou fazer um agendamento e gravar em Storage. Detalhe, as vezes já caia por "npm ERR! code ELIFECYCLE" Mas neste caso, fechava e abria e ficava normal, agora toda vez que tenta gravar em Storage. E o codigo Ionic não dá erro nenhum e diz que gravou, vou em application e na database gravou e ate com enviado "true"


C:\Alura\Ionic 3\Parte1\aluracar-webservice>npm start

> api@1.0.0 start C:\Alura\Ionic 3\Parte1\aluracar-webservice
> node server.js

Servidor rodando em http://localhost:8080
Agendamento recebido: {"nomeCliente":"A","enderecoCliente":"B","emailCliente":"C
","modeloCarro":"C3 1.0","precoTotal":22000,"confirmado":false,"enviado":false}
C:\Alura\Ionic 3\Parte1\aluracar-webservice\api.js:67
        const agendamentoId = agendamento.emailCliente + agendamento.data.substr
(0, 10);
                                                                         ^

TypeError: Cannot read property 'substr' of undefined
    at enviaNotificacao (C:\Alura\Ionic 3\Parte1\aluracar-webservice\api.js:67:7
4)
    at Timeout.setTimeout (C:\Alura\Ionic 3\Parte1\aluracar-webservice\api.js:46
:30)
    at ontimeout (timers.js:386:11)
    at tryOnTimeout (timers.js:250:5)
    at Timer.listOnTimeout (timers.js:214:5)

npm ERR! Windows_NT 6.1.7601
npm ERR! argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\
node_modules\\npm\\bin\\npm-cli.js" "start"
npm ERR! node v6.12.2
npm ERR! npm  v3.10.10
npm ERR! code ELIFECYCLE
npm ERR! api@1.0.0 start: `node server.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the api@1.0.0 start script 'node server.js'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the api package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node server.js
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs api
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!     npm owner ls api
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     C:\Alura\Ionic 3\Parte1\aluracar-webservice\npm-debug.log

C:\Alura\Ionic 3\Parte1\aluracar-webservice>ionic info
[WARN] You are not in an Ionic project directory. Project context may be
       missing.

cli packages: (C:\Users\Andre\AppData\Roaming\npm\node_modules)

    @ionic/cli-utils  : 1.16.0
    ionic (Ionic CLI) : 3.16.0

System:

    Node : v6.12.2
    npm  : 3.10.10
    OS   : Windows 7

Misc:

    backend : pro
7 respostas

Meus Códigos.

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams, AlertController, Alert } from 'ionic-angular';
import { Carro } from '../../modelos/carro';
import { AgendamentosServiceProvider } from '../../providers/agendamentos-service/agendamentos-service';
import {HomePage} from '../home/home';
import {Agendamento} from '../../modelos/agendamento';

import { Storage } from '@ionic/storage';
import { Observable } from 'rxjs/Observable';



@IonicPage()
@Component({
  selector: 'page-cadastro',
  templateUrl: 'cadastro.html',
})
export class CadastroPage {

  public carro: Carro;
  public precoTotal: number; 

  public nome: string = '';
  public endereco: string = '';
  public email: string = '';
  public data: string = new Date().toISOString();

  private _alerta: Alert;

  constructor(public navCtrl: NavController, 
      public navParams: NavParams,
      private _agendamentoService: AgendamentosServiceProvider,
      private _alertCrtl: 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._alertCrtl.create({
        title: 'Preenchimento obrigatório',
        subTitle: 'Preencha todos os campos',
        buttons: [
          { text : 'Ok'}
        ]
      }).present();

      return;

    }

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

    this._alerta = this._alertCrtl.create({
      title: 'Aviso',
      buttons: [
        { text: 'OK', 
          handler: () => {
            this.navCtrl.setRoot(HomePage);
        } 
      }
      ]
    });  

    let mensagem = '';

    this._agendamentoService
    .agenda(agendamento)
    .mergeMap( () => this.salva(agendamento))
    .finally(
      () => {
        this._alerta.setSubTitle(mensagem);
        this._alerta.present();
      }
    )
    .subscribe( 
      () => { 
          mensagem = 'Agendamento realizado!';
      },
      () => { 
          mensagem = 'Falha no Agendamento, tente novamente mais tarde';
      }
    );
  }

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

    return Observable.fromPromise(promisse);
  }


}
solução!

Boa noite, Andre! Como vai?

Como o próprio erro já diz, a API não está conseguindo encontrar a função substr() de undefinid.

TypeError: Cannot read property 'substr' of undefined

Isso está acontecendo pq vc não está enviando a data do agendamento para a API!

No entanto, não se preocupe pq esse já era um problema esperado e será corrigido logo mais a frente nessa aula aqui!

Espero que esteja gostando do curso pq ainda tem a parte 2 com mtas surpresas e coisas bacanas pela frente!

Grande abraço e bons estudos, meu aluno!

Muito Obrigado Gabriel.

Vou continuar e testar na aula acima e pretendo concluir com a parte 2. Gostei do Ionic, porem, faz um tempo que fiz o Angular 2 e tenho uma duvida, porque quando fiz era para Ionic 2 e percebi que existiram várias melhorias principalmente em encapsulamento de rotinas em Ionic 3.

E diferente do proposto em Node.js no curso, estou fazendo com um backuground em Java EE. Poderia apenas me dar um exemplo como ficaria um GET e um POST retornando o próprio objeto enviado em Ionic 3

Tenho um serviço em rest que envio email e senha e verifico o logon, porem, não quero fazer GET conforme curso e meu serviço retorna o próprio usuário com os demais dados preenchidos. Está tudo de Json, que vai e vem. Estou tendo problemas porque subscribe não aparece, pede Observabe e lembro que tinha como fazer um Observable ou alguma coisa que vinha a classe modelo escolhida... Detalhe, estou usando Post por um motivo, não desejo um serviço com dados em URL, quero encapsular em um form post.

Porque acho esse exemplo importante, porque invés de ser um simples logon é o mesmo caminho das pedras para uma função que executa uma ação, retorna um objeto e com esse objeto vc efetiva uma outra ação com uma escolha do usuário, dependências de objetos usando Webservice Rest.

Detalhe, não tenho código a te dar porque optei em refazer e iniciei o Ionic 3 justamente para tentar sanar isso.

Pode dar um exemplo disso? Ou tem em algum capitulo?

Boa tarde, Andre! Como vai?

O ideal é que vc abra um outro tópico referente à essa dúvida para que os assuntos não se misturem num mesmo tópico até para facilitar que outras pessoas que possam estar com o mesmo problema que vc possam interagir.

Grande abraço e bons estudos, meu aluno!

Muito Obrigado pela resposta e compreendo perfeitamente, não abri de cara para saber como proceder corretamente. Vou tentar novamente antes e caso não consiga abro sim.

Muito Obrigado

Mto bem, Andre!

Sempre que tiver qualquer dúvida é só mandar aqui no fórum!

Grande abraço e bons estudos, meu aluno!

Ia falar a mesma coisa aqui, rs.

Eu consegui simular os mesmos processos que o professor alterando a linha com erro direto no webservice:

Caminho: aluracar-webservice/aluracar-webservice/api.js

// const agendamentoId = agendamento.emailCliente + agendamento.data.substr(0, 10);
const agendamentoId = agendamento.emailCliente + agendamento.data;

Quando for concertar, basta adicionar o substr igual fizemos no método salvar:

this.data.substr(0, 10)

Assim, todos conseguem simular igual ao do Professor. /o/