类型'Observable <Response>'上不存在属性'map'

Mal*_*iri 168 asp.net-core-mvc visual-studio-2015 typescript1.8 angular

我试图从Angular调用API但是我收到此错误:

Property 'map' does not exist on type 'Observable<Response>'

这个类似问题的答案并没有解决我的问题:Angular 2 beta.17:'Observable <Response>'类型中不存在属性'map'.

我正在使用Angular 2.0.0-beta.17.

Thi*_*ier 324

您需要导入map运算符:

import 'rxjs/add/operator/map'
Run Code Online (Sandbox Code Playgroud)

或者更一般地说:

import 'rxjs/Rx';
Run Code Online (Sandbox Code Playgroud)

注意:对于RxJS 6.x.x及更高版本,您必须使用可管道运算符,如下面的代码片段所示:

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);
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

这是因为RxJS团队取消了对使用的支持请参阅RxJS'changelog中的重大更改以获取更多信息.

来自更改日志:

运算符:现在必须从rxjs导入可管理运算符,如下所示:import { map, filter, switchMap } from 'rxjs/operators';.没有深度进口.

  • 首先在您的项目的vs代码终端中编写此命令,然后重新启动项目。`npm install rxjs-compat`,而不是导入`map`运算符。 (4认同)

Nic*_*ges 136

重新审视这个,因为我的解决方案没有列在这里.

我用rxjs 6.0运行Angular 6并遇到了这个错误.

这是我做的修复它:

我变了

map((response: any) => response.json())
Run Code Online (Sandbox Code Playgroud)

简单地说:

.pipe(map((response: any) => response.json()));
Run Code Online (Sandbox Code Playgroud)

我在这里找到了修复:

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

希望有所帮助.

  • 这对我有用,我还需要从'rxjs/operators'中添加`import {map};` (15认同)
  • 我不确定为什么迁移工具 rxjs-5-to-6-migrate 没有选择这个?有趣的是,它没有解决 do/tap 重新映射问题,即使导入工具识别出它,在我的环境中仍然无法解决。我在 Angular 开发中 90% 的“意外浪费时间”都花在了 RxJS 文档和代码边界问题上,这真的很令人沮丧。 (2认同)
  • @paul谢谢.关于`.catch`,我们可以使用`catchError`,如`.pipe(catchError(this.handleError))`` (2认同)

Kar*_*ani 53

只需在项目的vs代码终端中编写此命令,然后重新启动项目.

npm install rxjs-compat
Run Code Online (Sandbox Code Playgroud)

你需要map通过写这个来导入运算符:

import 'rxjs/add/operator/map';
Run Code Online (Sandbox Code Playgroud)

  • 如果它不起作用,请关闭所有文件并重新启动 vs studio。 (2认同)

S.G*_*eau 25

我在Angular 2.0.1中遇到了同样的问题,因为我从中导入了Observable

import { Observable } from 'rxjs/Observable';
Run Code Online (Sandbox Code Playgroud)

我解决了从此路径导入Observable的问题

import { Observable } from 'rxjs';
Run Code Online (Sandbox Code Playgroud)


Nad*_*smi 23

对于Angular 7v

更改

import 'rxjs/add/operator/map';
Run Code Online (Sandbox Code Playgroud)

import { map } from "rxjs/operators"; 
Run Code Online (Sandbox Code Playgroud)

 return this.http.get('http://localhost/ionicapis/public/api/products')
 .pipe(map(res => res.json()));
Run Code Online (Sandbox Code Playgroud)


小智 14

在rxjs 6中,地图操作员的使用情况已经改变,现在您需要像这样使用它.

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

供参考 https://www.academind.com/learn/javascript/rxjs-6-what-c​​hanged/#operators-update-path


mka*_*mal 12

在新版本的 Angular 中的 httpClient 模块中,你还没有这样写:

return this.http.request(request)
      .map((res: Response) => res.json());
Run Code Online (Sandbox Code Playgroud)

但这样做:

return this.http.request(request)
             .pipe(
               map((res: any) => res.json())
             );
Run Code Online (Sandbox Code Playgroud)


Hea*_*ren 7

在最新的Angular 7。*。*中,您可以尝试以下操作:

import { Observable, of } from "rxjs";
import { map, catchError } from "rxjs/operators";
Run Code Online (Sandbox Code Playgroud)

然后,您可以methods按以下方式使用它们:

   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);
      })
    );
  }
Run Code Online (Sandbox Code Playgroud)

查看此演示以获取更多详细信息。


Ami*_*r.S 6

只需在终端输入即可安装rxjs-compat:

npm install --save rxjs-compat
Run Code Online (Sandbox Code Playgroud)

然后导入:

import 'rxjs/Rx';
Run Code Online (Sandbox Code Playgroud)


Dus*_*han 6

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));
}
Run Code Online (Sandbox Code Playgroud)

在上面的函数中,您可以看到我没有使用 res.json(),因为我使用的是 HttpClient。它自动应用 res.json() 并返回 Observable (HttpResponse <string>)。您不再需要在 HttpClient 中的 angular 4 之后自己调用此函数。


Ale*_*huk 5

在我的情况下,仅包括地图和承诺是不够的:

import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toPromise';
Run Code Online (Sandbox Code Playgroud)

我通过导入几个rxjs组件解决了这个问题,正如官方文档建议:

1)在一个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';
Run Code Online (Sandbox Code Playgroud)

2)在您的服务中导入rxjs-operator本身:

// Add the RxJS Observable operators we need in this app.
import './rxjs-operators';
Run Code Online (Sandbox Code Playgroud)