2017-03-24 3 views
5

Edit: Lesen Sie den Teil am Ende der Frage!TypeError: error.json ist keine Funktion

ich diesen Fehler: enter image description hereenter image description here

Mein Service-Code:

import { Http, Response, Headers } from "@angular/http"; 
import { Injectable } from "@angular/core"; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/catch'; 
import { Observable } from "rxjs"; 

import { Client } from "./client.model"; 

@Injectable() 
export class ClientService { 
    private clients: Client[] = []; 

    constructor(private http: Http){} 

    addClient(client: Client) { 
     this.clients.push(client); 
     const body = JSON.stringify(client); 
     const headers = new Headers({'Content-Type': 'application/json'}); 
     return this.http.post('http://localhost:3000/client', body, {headers: headers}) 
      .map((response: Response) => response.json()) 
      .catch((error: Response) => Observable.throw(error.json())); 
    } 

    getClients() { 
     return this.clients; 
    } 

    deleteClient(client: Client) { 

    } 
} 

Und in meiner Komponente Ich habe diese einreichen Funktion:

onSubmit(form: NgForm) { 
    let email = form.value.email; 
    let password = form.value.password; 
    let firstName = form.value.firstName; 
    let lastName = form.value.lastName; 

    const client = new Client(email, password, firstName, lastName); 
    this.clientService.addClient(client) 
     .subscribe(
      data => console.log(data), 
      error => console.error(error) 
     ); 
    form.resetForm(); 
} 

Es gibt ähnliche Fehler here und here. Die Antwort ist immer, die rxjs-Funktionen einzuschließen, aber ich mache das, deshalb bin ich mir nicht ganz sicher, warum ich diesen Fehler bekomme.

Edit:

Also das eigentliche Problem war nicht diese Funktion, sondern eine fehlende "/" vor meiner Route in der Haupt app.js Datei. Nachdem das gelöst war, war das Problem weg.

+0

Mögliche Duplikat [Angular2: res.json ist keine Funktion] (http://stackoverflow.com/questions/39162056/angular2-res-json-is-not- a-function) – Igor

+0

@Igor Du hast meine Lochfrage gelesen, oder? Ich habe darauf hingewiesen, dass es ähnliche Probleme gibt, die für mich nicht funktionieren. – Zoker

+0

Ich habe deine ganze Frage gelesen. Der Grund dafür ist, dass es json nicht wie im Duplikat enthält. Es gibt andere ähnliche Fragen, alle mit dem gleichen Täter. Debuggen Sie in Ihrem Browser und überprüfen Sie den Status der Antwort in dem Fehler, Sie werden wahrscheinlich feststellen, dass tatsächlich kein JSON verfügbar ist. Sie können dies auch tun, indem Sie das Ergebnis auf der Netzwerk-IO-Registerkarte Ihres Browser-Debuggers auschecken. – Igor

Antwort

3

Nicht fangen und neu streichen. Behandeln Sie die Ausnahme nur, wenn Sie den Service nutzen.

.map(response => response.json()); 

Oder wenn Sie die Ausnahme in Ihrem Service zu handhaben, und nur einen Fehler zurück Sie die

.map(response => response.json()) 
      .catch(error => Observable.throw("Error in x service")); 

Sie können folgendes tun die documentation von Observable.throw sehen und wie es verwendet wird, .

Das Fehlerobjekt, das Sie erhalten, ist fehlerhaft. Sie können einige Konsolenprotokolle hinzufügen, um zu sehen, was Sie zurückbekommen. Aber es verursacht Probleme.

+0

Leider immer noch den gleichen Fehler .... – Zoker

+0

Jetzt bekomme ich das: http://fs5.directupload.net/images/170324/9oxnhpki.png – Zoker

+0

@Zoker versuchen Sie die Lösung, die ich gerade hinzugefügt habe. –

4

Nun, wie es heißt. Der von der Observable zurückgegebene Fehler enthält die json-Methode nicht. Dies bedeutet, dass es nicht vom Typ Response ist, aber es enthält nur den Fehler. Sie sollten nur versuchen, das Objekt in der Konsole zu drucken und sehen, was da drin ist:

.catch((error: any) => console.log(error)) 

Sie werden wahrscheinlich feststellen, es ist nur ein xmlhttpresponse Objekt

+3

http://fs5.directupload.net/images/ 170324/5pt2upu4.png – Zoker

2

Dont Anruf json() auf Antwort vom Typ Antwort. Falls Sie Daten zurück erwarten, z. Client nur hinzugefügt, gerade tun:

.map((data: any) => { 
    return data._embedded.client as Client; 
});