Http.request () থেকে কীভাবে সঠিকভাবে ব্যতিক্রম ধরা যায়?


132

আমার কোডের অংশ:

import {Injectable} from 'angular2/core';
import {Http, Headers, Request, Response} from 'angular2/http';
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/operator/map';

@Injectable()
export class myClass {

  constructor(protected http: Http) {}

  public myMethod() {
    let request = new Request({
      method: "GET",
      url: "http://my_url"
    });

    return this.http.request(request)
      .map(res => res.json())
      .catch(this.handleError); // Trouble line. 
                                // Without this line code works perfectly.
  }

  public handleError(error: Response) {
    console.error(error);
    return Observable.throw(error.json().error || 'Server error');
  }

}

myMethod() ব্রাউজারের কনসোলে ব্যতিক্রম উত্পাদন করে:

মৌলিক ছাড়: প্রকারের ত্রুটি: এটি। HTTP.request (...)। মানচিত্র (...)। ধরা কোনও ফাংশন নয়

উত্তর:


213

সম্ভবত আপনি এটি আপনার আমদানিতে যুক্ত করার চেষ্টা করতে পারেন:

import 'rxjs/add/operator/catch';

আপনি এটি করতে পারেন:

return this.http.request(request)
  .map(res => res.json())
  .subscribe(
    data => console.log(data),
    err => console.log(err),
    () => console.log('yay')
  );

প্রতি মন্তব্য:

ছাড়: প্রকারের ত্রুটি: পর্যবেক্ষণযোগ্য_1. অবজারভেবল.থ্রো কোনও ফাংশন নয়

একইভাবে, এর জন্য, আপনি ব্যবহার করতে পারেন:

import 'rxjs/add/observable/throw';

2
সহায়তার জন্য আপনাকে ধন্যবাদ, এটি কাজ করে। এর পরে throw()ফাংশনে আমার একই সমস্যা আছে । import 'rxjs/Rx';পরিবর্তে আমি এই লাইনটি যুক্ত করেছি । এখন সমস্ত অপারেটর সঠিকভাবে কাজ করে।
এমএনভি

.catchসত্যই কাজ করে কিনা তা দেখার জন্য আপনি কি কোনও ত্রুটি অনুকরণ করেছিলেন? এটি .subscribe() নিশ্চিতভাবে কাজ করে।
acdcjunior

1
হ্যাঁ, দ্বিতীয় সমস্যা ছিল EXCEPTION: TypeError: Observable_1.Observable.throw is not a function। এটি @ ম্যাটসকার্পিনো উত্তরের সাথে বা এই প্লামকারের ম্যানারে ঠিক করা যেতে পারে যেমন আমি উপরে বলেছি: কৌণিক.ইও রিসোর্স
লাইভ-

16
শুধু আমদানিও নিক্ষেপ করুন: import 'rxjs/add/observable/throw';এবং সবকিছু আমদানি করবেন না, এটি খুব বিশাল।
dfsq

দুর্দান্ত সমাধান ,,, খুব সহায়ক, আমি যুক্ত করতে পারি (এরর) টাইপের রেসপন্স
মোহাম্মদ সুয়েজ

77

HttpClientModule এবং RxJS v5.5.x ব্যবহার করতে নতুন পরিষেবা আপডেট হয়েছে :

import { Injectable }                    from '@angular/core';
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
import { Observable }                    from 'rxjs/Observable';
import { catchError, tap }               from 'rxjs/operators';
import { SomeClassOrInterface}           from './interfaces';
import 'rxjs/add/observable/throw';

@Injectable() 
export class MyService {
    url = 'http://my_url';
    constructor(private _http:HttpClient) {}
    private handleError(operation: String) {
        return (err: any) => {
            let errMsg = `error in ${operation}() retrieving ${this.url}`;
            console.log(`${errMsg}:`, err)
            if(err instanceof HttpErrorResponse) {
                // you could extract more info about the error if you want, e.g.:
                console.log(`status: ${err.status}, ${err.statusText}`);
                // errMsg = ...
            }
            return Observable.throw(errMsg);
        }
    }
    // public API
    public getData() : Observable<SomeClassOrInterface> {
        // HttpClient.get() returns the body of the response as an untyped JSON object.
        // We specify the type as SomeClassOrInterfaceto get a typed result.
        return this._http.get<SomeClassOrInterface>(this.url)
            .pipe(
                tap(data => console.log('server data:', data)), 
                catchError(this.handleError('getData'))
            );
    }

পুরানো পরিষেবা, যা অবহেলিত HTTPModule ব্যবহার করে:

import {Injectable}              from 'angular2/core';
import {Http, Response, Request} from 'angular2/http';
import {Observable}              from 'rxjs/Observable';
import 'rxjs/add/observable/throw';
//import 'rxjs/Rx';  // use this line if you want to be lazy, otherwise:
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/do';  // debug
import 'rxjs/add/operator/catch';

@Injectable()
export class MyService {
    constructor(private _http:Http) {}
    private _serverError(err: any) {
        console.log('sever error:', err);  // debug
        if(err instanceof Response) {
          return Observable.throw(err.json().error || 'backend server error');
          // if you're using lite-server, use the following line
          // instead of the line above:
          //return Observable.throw(err.text() || 'backend server error');
        }
        return Observable.throw(err || 'backend server error');
    }
    private _request = new Request({
        method: "GET",
        // change url to "./data/data.junk" to generate an error
        url: "./data/data.json"
    });
    // public API
    public getData() {
        return this._http.request(this._request)
          // modify file data.json to contain invalid JSON to have .json() raise an error
          .map(res => res.json())  // could raise an error if invalid JSON
          .do(data => console.log('server data:', data))  // debug
          .catch(this._serverError);
    }
}

আমি ডিবাগিংয়ের জন্য .do()( এখন.tap() ) ব্যবহার করি ।

যখন একটি সার্ভার ত্রুটির আছে, bodyএর Responseঅবজেক্ট আমি সার্ভারের আমি (Lite-সার্ভার) ব্যবহার করছি থেকে পাওয়া শুধুমাত্র পাঠ্য, অত কারণ আমি ব্যবহার রয়েছে err.text()উপরে বদলে err.json().error। আপনার সার্ভারের জন্য আপনাকে সেই লাইনটি সামঞ্জস্য করতে হতে পারে।

যদি res.json()কোনও ত্রুটি উত্থাপন করে কারণ এটি জেএসওএন ডেটা পার্স করতে পারে নি, _serverErrorকোনও Responseবস্তু পাবে না , তাই instanceofচেকের কারণ ।

এই plunker পরিবর্তন urlকরতে ./data/data.junkএকটি ত্রুটি তৈরি করতে।


যে কোনও পরিষেবার ব্যবহারকারীদের কোড থাকা উচিত যা ত্রুটিটি পরিচালনা করতে পারে:

@Component({
    selector: 'my-app',
    template: '<div>{{data}}</div> 
       <div>{{errorMsg}}</div>`
})
export class AppComponent {
    errorMsg: string;
    constructor(private _myService: MyService ) {}
    ngOnInit() {
        this._myService.getData()
            .subscribe(
                data => this.data = data,
                err  => this.errorMsg = <any>err
            );
    }
}

4

এই কাজ করার বিভিন্ন উপায় আছে। দুটোই খুব সাধারণ। উদাহরণগুলির প্রতিটি দুর্দান্ত কাজ করে। আপনি এটি আপনার প্রকল্পে অনুলিপি করতে পারেন এবং এটি পরীক্ষা করতে পারেন।

প্রথম পদ্ধতিটি পছন্দনীয়, দ্বিতীয়টি কিছুটা পুরানো, তবে এখনও পর্যন্ত এটি খুব কার্যকর।

1) সমাধান 1

// File - app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';

import { AppComponent } from './app.component';
import { ProductService } from './product.service';
import { ProductModule } from './product.module';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    HttpClientModule
  ],
  providers: [ProductService, ProductModule],
  bootstrap: [AppComponent]
})
export class AppModule { }



// File - product.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

// Importing rxjs
import 'rxjs/Rx';
import { Observable } from 'rxjs/Rx';
import { catchError, tap } from 'rxjs/operators'; // Important! Be sure to connect operators

// There may be your any object. For example, we will have a product object
import { ProductModule } from './product.module';

@Injectable()
export class ProductService{
    // Initialize the properties.
    constructor(private http: HttpClient, private product: ProductModule){}

    // If there are no errors, then the object will be returned with the product data.
    // And if there are errors, we will get into catchError and catch them.
    getProducts(): Observable<ProductModule[]>{
        const url = 'YOUR URL HERE';
        return this.http.get<ProductModule[]>(url).pipe(
            tap((data: any) => {
                console.log(data);
            }),
            catchError((err) => {
                throw 'Error in source. Details: ' + err; // Use console.log(err) for detail
            })
        );
    }
}

2) সমাধান 2. এটি পুরানো উপায় তবে এখনও কাজ করে।

// File - app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpModule } from '@angular/http';

import { AppComponent } from './app.component';
import { ProductService } from './product.service';
import { ProductModule } from './product.module';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    HttpModule
  ],
  providers: [ProductService, ProductModule],
  bootstrap: [AppComponent]
})
export class AppModule { }



// File - product.service.ts
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';

// Importing rxjs
import 'rxjs/Rx';
import { Observable } from 'rxjs/Rx';

@Injectable()
export class ProductService{
    // Initialize the properties.
    constructor(private http: Http){}

    // If there are no errors, then the object will be returned with the product data.
    // And if there are errors, we will to into catch section and catch error.
    getProducts(){
        const url = '';
        return this.http.get(url).map(
            (response: Response) => {
                const data = response.json();
                console.log(data);
                return data;
            }
        ).catch(
            (error: Response) => {
                console.log(error);
                return Observable.throw(error);
            }
        );
    }
}

-1

আরএক্সজেএস ফাংশনগুলি বিশেষভাবে আমদানি করা দরকার। এটি করার একটি সহজ উপায় এর সাথে এর সমস্ত বৈশিষ্ট্য আমদানি করাimport * as Rx from "rxjs/Rx"

তারপরে Observableক্লাসটি অ্যাক্সেস করার বিষয়টি নিশ্চিত করুন Rx.Observable


15
আরএক্সজেস খুব বড় ফাইল, আপনি যদি এর সমস্ত ফায়ার আমদানি করেন তবে এটি আপনার লোডিংয়ের সময়
বাড়িয়ে দেবে

আপনার যদি কেবল এক বা দুটি অপারেটরের প্রয়োজন হয় তবে আপনাকে আরএক্সজেস থেকে সমস্ত কিছু আমদানি করা উচিত নয়।
মার্সেল-কে

-4

কৌণিক 4 ব্যবহারের সর্বশেষতম সংস্করণে

import { Observable } from 'rxjs/Rx'

এটি সমস্ত প্রয়োজনীয় জিনিস আমদানি করবে।


20
এটি করবেন না, এটি সমস্ত Rxjs আমদানি করবে।
মার্সেল-কে

এবং এর ফলে বান্ডেলের আকার বাড়বে!
তুষার ওয়ালজাদে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.