টাইপস্ক্রিপ্ট ত্রুটি সহ কৌণিক এইচটিটিপি পেতে পারেন http.get (…)। ম্যাপটি [নাল] এ কোনও ফাংশন নয়


334

কৌণিকের মধ্যে HTTP নিয়ে আমার সমস্যা আছে a

আমি কেবল GETএকটি JSONতালিকাতে চাই এবং এটি ভিউতে দেখাব।

পরিষেবা ক্লাস

import {Injectable} from "angular2/core";
import {Hall} from "./hall";
import {Http} from "angular2/http";
@Injectable()
export class HallService {
    public http:Http;
    public static PATH:string = 'app/backend/'    

    constructor(http:Http) {
        this.http=http;
    }

    getHalls() {
           return this.http.get(HallService.PATH + 'hall.json').map((res:Response) => res.json());
    }
}

এবং HallListComponentআমি getHallsপরিষেবাটি থেকে পদ্ধতিটি কল করি :

export class HallListComponent implements OnInit {
    public halls:Hall[];
    public _selectedId:number;

    constructor(private _router:Router,
                private _routeParams:RouteParams,
                private _service:HallService) {
        this._selectedId = +_routeParams.get('id');
    }

    ngOnInit() {
        this._service.getHalls().subscribe((halls:Hall[])=>{ 
            this.halls=halls;
        });
    }
}

তবে, আমি একটি ব্যতিক্রম পেয়েছি:

TypeError: this.http.get (...)। ম্যাপটি [নাল] এ কোনও ফাংশন নয়

হল-center.component

import {Component} from "angular2/core";
import {RouterOutlet} from "angular2/router";
import {HallService} from "./hall.service";
import {RouteConfig} from "angular2/router";
import {HallListComponent} from "./hall-list.component";
import {HallDetailComponent} from "./hall-detail.component";
@Component({
    template:`
        <h2>my app</h2>
        <router-outlet></router-outlet>
    `,
    directives: [RouterOutlet],
    providers: [HallService]
})

@RouteConfig([
    {path: '/',         name: 'HallCenter', component:HallListComponent, useAsDefault:true},
    {path: '/hall-list', name: 'HallList', component:HallListComponent}
])

export class HallCenterComponent{}

app.component

import {Component} from 'angular2/core';
import {ROUTER_DIRECTIVES} from "angular2/router";
import {RouteConfig} from "angular2/router";
import {HallCenterComponent} from "./hall/hall-center.component";
@Component({
    selector: 'my-app',
    template: `
        <h1>Examenopdracht Factory</h1>
        <a [routerLink]="['HallCenter']">Hall overview</a>
        <router-outlet></router-outlet>
    `,
    directives: [ROUTER_DIRECTIVES]
})

@RouteConfig([
    {path: '/hall-center/...', name:'HallCenter',component:HallCenterComponent,useAsDefault:true}
])
export class AppComponent { }

tsconfig.json

{
  "compilerOptions": {
    "target": "ES5",
    "module": "system",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false
  },
  "exclude": [
    "node_modules"
  ]
}

Http.get কোনও প্রতিশ্রুতি ফেরায় না?
বিএমএম 6o

1
@ বিএমএম 6o নতুন Httpপরিষেবাটি একটি পর্যবেক্ষণযোগ্য ফিরিয়ে দেয়
ব্রোকো

1
আমি প্রায় অনুরূপ ইস্যুতে দৌড়েছি, একটি প্রকল্প অ্যাঙ্গুলার 2 বিটা -17 থেকে চূড়ান্ত প্রকাশে স্থানান্তরিত করার চেষ্টা করছি। ভিএস 2015, আপডেট 3 ব্যবহার করে আমার জন্য সমস্যাটি আমার আইডিই ছিল, টাইপস্ক্রিপ্ট ভাষা পরিষেবা এক্সটেনশানটি এখনও ছিল 1.8.36, যখন এনজি 2 কুইকস্টার্ট গাইড হিসাবে (যেমন আমি এটি লিখছি) ব্যবহার করছেন "typescript": "^2.0.2"। টিএস ল্যাং আপগ্রেড করা হচ্ছে। এক্সটেনশন এবং আপডেটের মাধ্যমে পরিষেবাটি আমার জন্য কৌশলটি করেছে। যখন আপডেটটি ইনস্টল করা হচ্ছিল তখন আমি এই এসও উত্তরটি পেয়েছিলাম , যা একই উপসংহারে শেষ হয়।
এরিক ইজারা

পিএইচপিস্টর্ম / ওয়েবস্টর্মের জন্য, আমার প্রকল্পের লাইব্রেরির সাথে টাইপ স্ক্রিপ্ট সংস্করণ আপডেট করাও সমস্যার সমাধান করেছে। আমি এই এসও উত্তরের পদক্ষেপগুলি অনুসরণ করেছি: stackoverflow.com/a/31608934/1291428
সেবাস

উত্তর:


538

আমার মনে হয় আপনার এটি আমদানি করা দরকার:

import 'rxjs/add/operator/map'

বা আরও সাধারণভাবে এটি যদি আপনি পর্যবেক্ষণযোগ্যদের জন্য আরও পদ্ধতি থাকতে চান। সতর্কতা: এটি সমস্ত 50+ অপারেটর আমদানি করবে এবং এগুলিকে আপনার অ্যাপ্লিকেশনে যুক্ত করবে, এইভাবে আপনার বান্ডিলের আকার এবং লোডের সময়গুলিকে প্রভাবিত করবে।

import 'rxjs/Rx';

আরও বিস্তারিত জানার জন্য এই সমস্যাটি দেখুন ।


1
কোন ত্রুটি এখনও রয়ে গেছে? আপনি স্ট্যাকওভারফ্লো সম্পর্কে এই বিষয়ে কিছু নির্দিষ্ট প্রশ্ন জিজ্ঞাসা করতে পারেন ;-) এই প্রশ্নটি আপনাকে সম্ভবত সহায়তা করতে পারে: stackoverflow.com/questions/34450131/…
থিয়েরি টেম্পিলার

1
কৌণিক 2 আরসি 0 হিসাবে, এটি আর প্রয়োজন হয় না।
ওনুর ইল্ডারিয়াম

3
@ অনুরওয়াল্ডরিম, আরসি ৪ ব্যবহার করে এই আমদানিটি এখনও প্রয়োজনীয়, যদি না আমি কিছু ভুল করি।
জোসেফ গ্যাব্রিয়েল

18
দয়া করে 'আমদানি' আরএক্সজেএস / আরএক্স 'ব্যবহার করবেন না; কারণ এটি সবকিছু আমদানি করে এবং rxjs বেশ বড় হতে থাকে। আপনার প্রয়োজন অনুসারে একের পর এক আমদানি করুন।
টানুন

1
Rxjs সহ কৌণিক 2: এখানে 5.0.0-beta.12। এবং আমার এখনও ছিল import 'rxjs/add/operator/do'... যদিও আমাদের .map()আর এটি করার দরকার নেই। তবে এটি আমার .do()ক্ষেত্রে সহায়তা করেছিল , বুঝতে পেরে আমার বিশেষভাবে এটি আমদানি করা দরকার। ধন্যবাদ! আমার কাছ থেকে এক আপ ভোট :)
মিঃক্রফট

82

কেবল কিছু পটভূমি ... সদ্য মিন্টেড সার্ভার কমিউনিকেশন ডেভ গাইড (পরিশেষে) এটি আলোচনা / উল্লেখ / ব্যাখ্যা করে:

আরএক্সজেএস লাইব্রেরিটি বেশ বড়। আকারের বিষয়টি বিবেচনা করে যখন আমরা একটি উত্পাদন অ্যাপ্লিকেশন তৈরি করি এবং এটি মোবাইল ডিভাইসে স্থাপন করি Size আমাদের কেবলমাত্র সেই বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করা উচিত যা আমাদের আসলে প্রয়োজন।

তদনুসারে, কৌণিক একটি ছিনতাই নিচে সংস্করণ প্রকাশ Observableমধ্যে rxjs/Observableমডিউল, একটি সংস্করণ যা বেশী আমরা এই ধরনের এখানে ব্যবহার করতে চান সেটি সহ প্রায় সব অপারেটরদের অভাব আছে mapপদ্ধতি।

আমাদের প্রয়োজনীয় অপারেটরগুলি যুক্ত করা আমাদের উপর নির্ভর করে। আমরা প্রতিটি অপারেটরকে এক এক করে যুক্ত করতে পারতাম, যতক্ষণ না আমাদের কাস্টম অবজার্ভেশনাল বাস্তবায়নটি আমাদের প্রয়োজনীয়তার সাথে যথাযথভাবে সুর করা হয়।

@ থিরি ইতিমধ্যে উত্তর হিসাবে, আমরা কেবল আমাদের অপারেটরদের টানতে পারি:

import 'rxjs/add/operator/map';
import 'rxjs/operator/delay';
import 'rxjs/operator/mergeMap';
import 'rxjs/operator/switchMap';

অথবা, আমরা যদি অলস হই তবে আমরা অপারেটরগুলির পুরো সেটটি টানতে পারি। সতর্কতা: এটি আপনার অ্যাপ্লিকেশন বান্ডেলে সমস্ত 50+ অপারেটর যুক্ত করবে এবং লোড সময়কে প্রভাবিত করবে

import 'rxjs/Rx';

2
'rxjs / Rx' আমদানি করুন; কি দারুন. এবং আমার সমস্ত চুল টানা সঙ্গে সঙ্গে চলে যায়। আমি বিশ্বাস করতে পারি না এটি আরএক্সজেএস / অ্যাঙ্গুলার 2 এর জন্য বিশ্বজুড়ে ছাপা হয়নি। ধন্যবাদ !!!
জিমবি

তবে এটি প্রায়শই লিঙ্ক দেয় না, ডিফল্টরূপে এটি একটি কালো তালিকাভুক্ত আমদানি। একটি নতুন কৌণিক সিএলআই প্রকল্প তৈরি করুন, আপনি দেখতে পাবেন। আমি নিজেই সুবিধাটি পছন্দ করি তবে এনওয়াইসিতে যে জায়গাগুলি আমি কাজ করি সেখানে কনভেনশন এটি করা না।
টিম কনসোলজিও

21

থেকে 5.5 rxjs অগ্রে, আপনি ব্যবহার করতে পারেন pipeable অপারেটার

import { map } from 'rxjs/operators';

এর সাথে কী ভুল? import 'rxjs/add/operator/map';

যখন আমরা এই পদ্ধতির ব্যবহার করব তখন mapঅপারেটর প্যাচ হবে observable.prototype এবং এই বস্তুর অংশ হয়ে যাবে।

যদি পরে, আপনি mapপর্যবেক্ষণযোগ্য স্ট্রিম পরিচালনা করে এমন কোড থেকে অপারেটর সরিয়ে ফেলার সিদ্ধান্ত নেন তবে সংশ্লিষ্ট আমদানি বিবৃতিটি অপসারণ করতে ব্যর্থ হন, কোড প্রয়োগ করে যে কোডটি mapতার একটি অংশ হিসাবে রয়ে গেছে Observable.prototype

যখন বান্ডেলররা অব্যবহৃত কোড ( ওরফে tree shaking ) মুছে ফেলার চেষ্টা করে , তখন তারা mapঅপারেটরের কোডটি প্রয়োগে ব্যবহার না করা সত্ত্বেও পর্যবেক্ষণযোগ্য কোডটিতে রাখার সিদ্ধান্ত নিতে পারে ।

সমাধান -Pipeable operators

পাইপযোগ্য অপারেটরগুলি খাঁটি ফাংশন এবং পর্যবেক্ষণযোগ্যকে প্যাচ করে না । আপনি ES6 আমদানি সিনট্যাক্স ব্যবহার করে অপারেটরগুলি আমদানি করতে পারেন import { map } from "rxjs/operators"এবং তারপরে এগুলিকে এমন কোনও ফাংশনে আবদ্ধ করতে পারেন pipe()যা পরিবর্তনশীল সংখ্যক পরামিতি গ্রহণ করে, যেমন চেইনেবল অপারেটরগুলি।

এটার মতো কিছু:

getHalls() {
    return this.http.get(HallService.PATH + 'hall.json')
    .pipe(
        map((res: Response) => res.json())
    );
}

16

কৌনিক 5 এর সাথে আরএক্সজেএস আমদানি উন্নত হয়।

পরিবর্তে

import 'rxjs/add/operator/map';

আমরা এখন পারি

import { map } from 'rxjs/operators';

এই পদ্ধতির ব্যবহার করে, এখন আপনার বিল্ডে এটি কেবল ব্যবহৃত অপারেটর (এই ক্ষেত্রে মানচিত্র) অন্তর্ভুক্ত করবে, এর আগে এটি আরএক্সজেএস লাইব্রেরির সমস্ত অপারেটরকে অন্তর্ভুক্ত করেছিল। আরও বিস্তারিত জানার জন্য নীচে লিঙ্ক চেক করুন। loiane.com/2017/08/angular-rxjs-imports
হিরেন শাহ

13

Observable.subscribeসরাসরি ব্যবহার করে কাজ করা উচিত।

@Injectable()
export class HallService {
    public http:Http;
    public static PATH:string = 'app/backend/'    

    constructor(http:Http) {
        this.http=http;
    }

    getHalls() {
    // ########### No map
           return this.http.get(HallService.PATH + 'hall.json');
    }
}


export class HallListComponent implements OnInit {
    public halls:Hall[];
    / *** /
    ngOnInit() {
        this._service.getHalls()
           .subscribe(halls => this.halls = halls.json()); // <<--
    }
}

5
এটি খুব দক্ষ পদ্ধতির নয়। উদাহরণস্বরূপ যদি সেখানে একাধিক গ্রাহক থাকে তবে সেগুলিতে একবারে সেবার পরিবর্তে তাদের প্রত্যেককে ডেটাতে মানচিত্র চালাতে হবে। আমি মনে করি ওপির সঠিক পন্থা ছিল, এটি ব্যবহারের জন্য সঠিক মডিউলটি লোড করা হয়নি।
ইভান প্লেস

3

কৌণিক সংস্করণ 5 এবং তারপরের জন্য, আপডেট করা আমদানি লাইনটি দেখতে দেখতে:

import { map } from 'rxjs/operators';

অথবা

import { map } from 'rxjs/operators';

এছাড়াও এই সংস্করণগুলি সম্পূর্ণরূপে পাইপযোগ্য অপারেটরকে সমর্থন করে যাতে আপনি সহজেই। পাইপ () এবং। সাবস্ক্রাইব () ব্যবহার করতে পারেন।

আপনি যদি কৌনিক সংস্করণ 2 ব্যবহার করে থাকেন তবে নিম্নলিখিত লাইনে একেবারে সূক্ষ্মভাবে কাজ করা উচিত:

import 'rxjs/add/operator/map';

অথবা

import 'rxjs/add/operators/map';

যদি আপনি এখনও সমস্যার মুখোমুখি হন তবে আপনাকে অবশ্যই এটি সঙ্গে যেতে হবে:

import 'rxjs/Rx';

আমি আপনাকে এটি সরাসরি ব্যবহার করতে পছন্দ করব না এটি লোড সময়কে উত্সাহিত করে Bcoz, কারণ এতে প্রচুর পরিমাণে অপারেটর রয়েছে (দরকারী এবং অ-দরকারী) যা শিল্পের নিয়ম অনুসারে একটি ভাল অনুশীলন নয়, তাই নিশ্চিত হয়ে নিন আপনি প্রথমে উল্লিখিত আমদানি করা লাইনগুলি ব্যবহার করার চেষ্টা করুন এবং যদি এটি কার্যকর না হয় তবে আপনার আরএক্সজেএস / আরএক্সের দিকে যাওয়া উচিত


3

আমার এই সমস্যার সমাধান আছে

এই প্যাকেজটি ইনস্টল করুন:

npm install rxjs@6 rxjs-compat@6 --save

তারপরে এই পাঠাগারটি আমদানি করুন

import 'rxjs/add/operator/map'

অবশেষে আপনার আয়নিক প্রকল্পটি পুনরায় আরম্ভ করুন

ionic serve -l

3

কৌণিক সংস্করণ 6 "0.6.8" rxjs সংস্করণ 6 "^ 6.0.0"

এই সমাধানটি হ'ল:

  "@angular-devkit/core": "0.6.8",
  "rxjs": "^6.0.0"

যেহেতু আমরা সকলেই জানি যে কৌণিকটি প্রতিদিন বিকশিত হচ্ছে তাই প্রতিদিন প্রচুর পরিবর্তন হয় এবং এই সমাধানটি কৌনিক 6 এবং rxjs 6 এর জন্য
প্রথমে HT yo এর সাথে কাজ করা উচিত এটি থেকে আমদানি করা উচিত: সর্বোপরি আপনাকে অ্যাপটিতে HTTPModule ঘোষণা করতে হবে। module.ts

import { Http } from '@angular/http';

এবং আপনাকে এনটিএমডিউল -> আমদানিতে HttpModule যুক্ত করতে হবে

  imports: [
    HttpModule,
    BrowserModule,
    FormsModule,
    RouterModule.forRoot(appRoutes)
  ],

দ্বিতীয়টি মানচিত্রের সাথে কাজ করার জন্য আপনাকে প্রথমে পাইপ আমদানি করতে হবে:

import { pipe } from 'rxjs';

তৃতীয় আপনার প্রয়োজন থেকে মানচিত্র ফাংশন আমদানি:

import { map } from 'rxjs/operators';

পাইপের অভ্যন্তরে আপনাকে এই উদাহরণটির মতো মানচিত্র ব্যবহার করতে হবে:

 constructor(public http:Http){  }

    getusersGET(){
        return this.http.get('http://jsonplaceholder.typicode.com/users').pipe(
         map(res => res.json()  )  );
    }

যে পুরোপুরি শুভকামনা কাজ করে!


2

মানচিত্র এখানে ব্যবহার করছেন তা .map()জাভাস্ক্রিপ্টে নয়, এটি Rxjs মানচিত্রের ফাংশন যা কাজ করছেObservables ...

সুতরাং সেই ক্ষেত্রে যদি আপনি ফলাফলের ডেটাতে মানচিত্র ব্যবহার করতে চান তবে আপনাকে এটি আমদানি করতে হবে ...

map(project: function(value: T, index: number): R, thisArg: any): Observable<R> উত্স পর্যবেক্ষণযোগ্য দ্বারা নির্গত প্রতিটি মানের জন্য একটি প্রদত্ত প্রকল্প ফাংশন প্রয়োগ করে এবং ফলাফল হিসাবে মান হিসাবে পর্যবেক্ষক হিসাবে নির্গত হয়।

সুতরাং সহজভাবে এটি আমদানি করুন:

import 'rxjs/add/operator/map';

1

যেহেতু Http সেবার angular2 আয় একটি লক্ষণীয় ধরন, আপনার Angular2 ইনস্টলেশন ডিরেক্টরি থেকে (আমার ক্ষেত্রে 'node_modules'), আমরা আপনার পর্যবেক্ষণযোগ্য আমদানি মানচিত্র ফাংশন প্রয়োজন উপাদান ব্যবহার HTTP- র , সেবা হিসাবে:

import 'rxjs/add/operator/map';


1

আপনার ফাইলটিতে কেবল লাইন যুক্ত করুন,

'rxjs / Rx' আমদানি করুন;

এটি গুচ্ছ নির্ভরতা আমদানি করবে ang কৌণিক 5 এ পরীক্ষিত


0

সত্য, আরএক্সজেস তার মানচিত্র অপারেটরটিকে একটি পৃথক মডিউলে পৃথক করেছে এবং এখন আপনাকে অন্য অপারেটরের মতো এটির স্পষ্টতা আমদানি করতে হবে।

import rxjs/add/operator/map;

এবং আপনি ভাল থাকবেন।




0

এটি ঘটছে কারণ আপনি আরএক্সজেএস ব্যবহার করছেন এবং আরএক্সজেএস ফাংশন স্থির নয় যার অর্থ আপনি সরাসরি তাদের কল করতে পারবেন না পাইপের অভ্যন্তরীণ পদ্ধতিগুলি কল করতে এবং rxjs লাইব্রেরি থেকে ফাংশনটি আমদানি করতে হবে

তবে আপনি যদি rxjs-compat ব্যবহার করছেন তবে আপনাকে কেবল rxjs-compat অপারেটরগুলি আমদানি করতে হবে


0

আমি আদেশগুলির নীচে চেষ্টা করেছি এবং এটি স্থির হয়ে গেছে:

npm install rxjs@6 rxjs-compat@6 --save


import 'rxjs/Rx';

এটি কেবলমাত্র আপনার জন্য কিছু প্যাচিং সম্পাদন করে আপনাকে rxjs 6 এ প্রাথমিকভাবে কাজ করাতে সহায়তা করবে। এটি কেবল একটি স্বল্প-মেয়াদী ফিক্স এবং পূর্ণ rxjs 6 রূপান্তর করা উচিত।
হ্যাঙ্ককা

0

'rxjs / অপারেটর' থেকে {মানচিত্র import আমদানি করুন;

এটি কৌনিক 8 এ আমার জন্য কাজ করে


0

এছাড়াও @ এমএলসি-ম্যালাপিস মন্তব্য করেছেন, আপনি লেটেবল অপারেটর এবং প্রোটোটাইপ প্যাচিং পদ্ধতিটি মিশ্রণ করছেন। এক বা অন্য ব্যবহার করুন

আপনার ক্ষেত্রে এটি হওয়া উচিত

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import 'rxjs/add/operator/map';

@Injectable()
export class SwPeopleService {
    people$ = this.http.get('https://swapi.co/api/people/')
      .map((res:any) => res.results);

    constructor(private http: HttpClient) {} 
}

https://stackblitz.com/edit/angular-http-observables-9nchvz?file=app%2Fsw-people.service.ts

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