Właściwość „map” nie istnieje dla typu „Observable <Response>”

Odpowiedzi:

371

Musisz zaimportować mapoperatora:

import 'rxjs/add/operator/map'

Lub bardziej ogólnie:

import 'rxjs/Rx';

Uwaga: W przypadku wersji RxJS 6.x.xi nowszych konieczne będzie użycie operatorów potokowych, jak pokazano w poniższym fragmencie kodu:

import { map } from 'rxjs/operators';
import { HttpClient } from '@angular/common/http';

// ...
export class MyComponent {
  constructor(private http: HttpClient) { }
  getItems() {
    this.http.get('https://example.com/api/items').pipe(map(data => {})).subscribe(result => {
      console.log(result);
    });
  }
}

Jest to spowodowane usunięciem przez zespół RxJS obsługi używania Zobacz przełamujące zmiany w dzienniku zmian RxJS, aby uzyskać więcej informacji.

Z dziennika zmian:

Operatorzy : operatorzy Pipeable musi teraz być importowane z rxjs tak: import { map, filter, switchMap } from 'rxjs/operators';. Bez głębokiego importu.

Thierry Templier
źródło
Niepoprawna nazwa modułu w rozszerzeniu, nie można znaleźć modułu „../../Observable”. Właściwość „map” nie istnieje dla typu „Observable <Response>”.
Malik Kashmiri
Jak importujesz Observableklasę? Jak to: import {Observable} from 'rxjs/Observable';czy import {Observable} from 'rxjs/Rx';?
Thierry Templier
Jak dotąd nie importuję tej klasy
Malik Kashmiri
1
Używam Angular 2 RC1 i rxjs 5.0.0-beta2. Zaimportowałem Observable jako import {Observable} z 'rxjs / observable'; oraz importowany operator mapy, taki jak import „rxjs / add / operator / map”; Działało, kiedy korzystałem z wersji Beta 7. Właśnie zaktualizowałem do wersji RC1 i zepsuło się.
Darshan Puranik
4
Najpierw napisz to polecenie w terminalu vs vs twojego projektu i zrestartuj projekt. npm install rxjs-compat, niż import mapoperatora.
Karan Raiyani
162

Ponownie odwiedzam, ponieważ mojego rozwiązania nie ma tutaj.

Używam Angulara 6 z rxjs 6.0 i napotkałem ten błąd.

Oto, co zrobiłem, aby to naprawić:

Zmieniłam

map((response: any) => response.json())

po prostu być:

.pipe(map((response: any) => response.json()));

Znalazłem poprawkę tutaj:

https://github.com/angular/angular/issues/15548#issuecomment-387009186

Nick Hodges
źródło
1
Nie jestem pewien, dlaczego narzędzie migracji rxjs-5-to-6-migrate tego nie odbiera? Interesujące jest to, że nie rozwiązuje problemu ponownego mapowania do / tap, które w moim środowisku jest nadal nierozwiązane, mimo że narzędzie importu je rozpoznaje. 90% mojego „nieoczekiwanego zmarnowanego czasu” w rozwoju Angulara spędzam z dokumentami RxJS i problemami z granicami kodu, co jest naprawdę frustrujące.
Joe
1
Dziękuję Ci! Jesteś ratownikiem !! Kto jest zainteresowany, pełne odniesienie do tej zmiany jest dostępne tutaj: github.com/ReactiveX/rxjs/blob/master/…
malvadao
21
To zadziałało dla mnie, musiałem też dodaćimport { map } from 'rxjs/operators';
Paweł
Zabawne, właśnie tak naprawiliśmy aktualizację kątową 6 - która przyniosła również najnowsze rxjs.
Max
2
@paul Thanks. Jeśli chodzi o .catch, możemy użyć catchErrorjak .pipe(catchError(this.handleError))?
FindOutIslamNow
60

po prostu napisz to polecenie w terminalu vs vs twojego projektu i zrestartuj projekt.

npm install rxjs-compat

Musisz zaimportować mapoperatora, pisząc to:

import 'rxjs/add/operator/map';
Karan Raiyani
źródło
1
jeśli to nie działa, zamknij wszystkie pliki i uruchom ponownie studio vs.
Ajay Takur,
1
To zadziałało dla mnie, dziękuję za dzielenie się.
thesamoanppprogrammer
30

Dla Angulara 7v

Zmiana

import 'rxjs/add/operator/map';

Do

import { map } from "rxjs/operators"; 

I

 return this.http.get('http://localhost/ionicapis/public/api/products')
 .pipe(map(res => res.json()));
Nadeem Qasmi
źródło
pomogło mi to @ Katana24, gdy zobaczyłem poprawną składnię z potokiem.
punkolog
25

Miałem ten sam problem z Angularem 2.0.1, ponieważ importowałem Observable

import { Observable } from 'rxjs/Observable';

Rozwiązuję problem z importowaniem Observable z tej ścieżki

import { Observable } from 'rxjs';
S.Galarneau
źródło
Ta praktyka jest uważana za nieprzyjazną dla rozmiaru pakietu, ponieważ ta instrukcja importuje wszystkich operatorów Observable(w tym tych, których nie używasz) do pakietu. Zamiast tego należy importować każdego operatora osobno. Polecam użycie „operatorów lettable”, które zostały wprowadzone w RxJS v5.5, aby wspierać lepsze wstrząsanie drzewem.
Sarun Intaralawan
15

W rxjs 6 użycie operatora map zostało zmienione, teraz musisz go używać w ten sposób.

import { map } from 'rxjs/operators';
myObservable
  .pipe(map(data => data * 2))
  .subscribe(...);

W celach informacyjnych https://www.academind.com/learn/javascript/rxjs-6-what-changed/#operators-update-path

Hari Prasad Sharma
źródło
Zwróć uwagę na tę odpowiedź, ponieważ każdy, kto to zrobi, RxJS v6będzie musiał użyć .pipe()lub żaden z operatorów nie będzie działał bezpośrednio z Observable. Zobaczysz błąd, taki jak:Property 'share' does not exist on type 'Observable<{}>'
atconway
8

po prostu zainstaluj rxjs-kompatybil, wpisując terminal:

npm install --save rxjs-compat

następnie zaimportuj:

import 'rxjs/Rx';
Amir S.
źródło
7

W najnowszej wersji Angulara 7. *. * Możesz wypróbować to po prostu jako:

import { Observable, of } from "rxjs";
import { map, catchError } from "rxjs/operators";

A następnie możesz użyć ich methodsw następujący sposób:

   private getHtml(): Observable<any> {
    return this.http.get("../../assets/test-data/preview.html").pipe(
      map((res: any) => res.json()),
      catchError(<T>(error: any, result?: T) => {
        console.log(error);
        return of(result as T);
      })
    );
  }

Sprawdź to demo, aby uzyskać więcej informacji.

Hearen
źródło
5

W moim przypadku nie wystarczy podać tylko mapę i obiecać:

import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toPromise';

Rozwiązałem ten problem, importując kilka komponentów rxjs zgodnie z oficjalną dokumentacją :

1) Zaimportuj instrukcje do jednego pliku app / rxjs-operators.ts:

// import 'rxjs/Rx'; // adds ALL RxJS statics & operators to Observable

// See node_module/rxjs/Rxjs.js
// Import just the rxjs statics and operators we need for THIS app.

// Statics
import 'rxjs/add/observable/throw';

// Operators
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/debounceTime';
import 'rxjs/add/operator/distinctUntilChanged';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/switchMap';
import 'rxjs/add/operator/toPromise';

2) Importuj samego operatora rxjs do swojej usługi:

// Add the RxJS Observable operators we need in this app.
import './rxjs-operators';
Alex Valchuk
źródło
Uważam, że niewłaściwe jest włączanie operatorów rxjs do wszystkich usług. Powinien być zawarty tylko w app.module.ts, ale niestety test zgłasza błąd, jeśli operatorzy nie są importowani w określonych miejscach
Mohan Ram
5
import { map } from "rxjs/operators";

getGetFunction(){
this.http.get('http://someapi')
.pipe(map(res => res));
}

getPostFunction(yourPara){
this.http.get('http://someapi',yourPara)
.pipe(map(res => res));
}

W powyższej funkcji widać, że nie użyłem res.json (), ponieważ używam HttpClient. Automatycznie stosuje res.json () i zwraca Observable (HttpResponse <string>). Nie musisz już wywoływać tej funkcji samodzielnie po kącie 4 w HttpClient.

Duszan
źródło
3

Miałem ten sam problem, korzystałem z programu Visual Studio 2015, który miał starszą wersję maszynopisu.

Po aktualizacji rozszerzenia problem został rozwiązany.

Link do pobrania

Naveen
źródło
3

Korzystam z Angulara 5.2, a kiedy import 'rxjs/Rx';go używam , generuje następujący błąd: TSLint: Ten import jest na czarnej liście, zamiast tego zaimportuj submoduł (import-blacklist)

Zobacz zrzut ekranu poniżej: Import rxjs / Rx znajduje się na czarnej liście w Angular 5.2

ROZWIĄZANIE: Rozwiązałem go, importując tylko tych operatorów, których potrzebowałem . Przykład poniżej:

import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';

Tak więc poprawka polegałaby na importowaniu tylko niezbędnych operatorów.

Devner
źródło
@AndrewBenjamin Gorąco sugeruję, abyś to zrobił. Pozwoli ci to zaoszczędzić wiele kłopotów na linii.
Devner,
3

Po prostu zainstaluj rxjs-kompatybil, aby rozwiązać problem

npm i rxjs-compat --save-dev

I zaimportuj go jak poniżej

import 'rxjs/Rx';
Ankit Bhatia
źródło
3

Najpierw uruchom instalację, jak poniżej:

npm install --save rxjs-compat@6

Teraz trzeba importować rxjsw service.ts:

import 'rxjs/Rx'; 

Voila! Problem został naprawiony.

Brahmmeswara Rao Palepu
źródło
3

po prostu uruchom npm install --save rxjs-compatto naprawia błąd.

Jest to zalecane tutaj

trustidkid
źródło
Nie zapomnij zaimportować „rxjs / add / operator / map”
trustidkid
2

Próbowałem wszystkich możliwych odpowiedzi zamieszczonych powyżej, żadna z nich nie działała,

Rozwiązałem to po prostu ponownie uruchamiając IDE, tj. Visual Studio Code

Niech to komuś pomoże.

Shylendra Madda
źródło
2

Ja też napotkałem ten sam błąd. Jednym z rozwiązań, który pracował dla mnie było, aby dodać następujące linie w swoim service.ts pliku zamiast z import 'rxjs/add/operator/map':

import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

Na przykład mój plik app.service.ts po debugowaniu wyglądał następująco:

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

@Injectable()
export class AppService {
    constructor(private http: HttpClient) {}
    getData(): Observable<any> {
        return this.http.get('https://samples.openweathermap.org/data/2.5/history/city?q=Warren,OH&appid=b6907d289e10d714a6e88b30761fae22')
        .pipe(map(result => result));
    }
}
Steffi Keran Rani J.
źródło
2

Jeśli po zaimportowaniu importu „rxjs / add / operator / map” lub importu „rxjs / Rx” również otrzymujesz ten sam błąd, a następnie uruchom ponownie edytor kodu Visual Studio, błąd zostanie rozwiązany.


źródło
1

dla wszystkich użytkowników Linuksa, którzy mają ten problem, sprawdź, czy folder rxjs-zgodny jest zablokowany. Miałem dokładnie ten sam problem i wszedłem do terminalu, użyłem sudo su, aby wyrazić zgodę na cały folder rxjs-kompatybilny i zostało to naprawione. To przy założeniu, że zaimportowałeś

import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch'; 

w pliku project.ts, w którym wystąpił oryginalny błąd mapy.

JavaJunior
źródło
1

Użyj mapfunkcji w pipefunkcji, aby rozwiązać problem. Można sprawdzić dokumentację tutaj .

this.items = this.afs.collection('blalal').snapshotChanges().pipe(map(changes => {
  return changes.map(a => {
    const data = a.payload.doc.data() as Items;
    data.id = a.payload.doc.id;
    return data;
  })
})
Mohammad Quanit
źródło
1

npm install rxjs @ 6 rxjs-kompatybil @ 6 --save

Ajay Takur
źródło
0
  import { Injectable } from '@angular/core';
  import { Http } from '@angular/http';
  import 'rxjs/add/operator/map';

  @Injectable({
  providedIn: 'root'
  })
  export class RestfulService {

  constructor(public http: Http) { }

 //access apis Get Request 
 getUsers() {
 return this.http.get('http://jsonplaceholder.typicode.com/users')
  .map(res => res.json());
  }

 }

uruchom polecenie

 npm install rxjs-compat 

Po prostu importuję

 import 'rxjs/add/operator/map';

uruchom ponownie kod vs, problem rozwiązany.

Nadeem Qasmi
źródło
-1

Nowa, kątowa wersja nie obsługuje .mapy, którą musisz zainstalować za pomocą cmd npm install - zapisz rxjs-compliance dzięki temu możesz cieszyć się starą techniką. Uwaga: nie zapomnij zaimportować tych linii.

import { Observable, Subject } from 'rxjs';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
Shailaja valiveti
źródło
1
Ta późna odpowiedź jest zbędna.
Tom Faltesek