【问题标题】:How to import map property of rxjs in angular project , Error : Property 'map' does not exist on type 'Observable<Object>'?如何在 Angular 项目中导入 rxjs 的地图属性,错误:“Observable<Object>”类型上不存在属性“地图”?
【发布时间】:2019-03-24 06:20:12
【问题描述】:

我正在使用 http post 请求和 rxjs 以角度在服务器上放置数据,但即使在导入 rxjs 的 map 属性之后,这也会出现错误。

import { Injectable } from '@angular/core';
import {HttpClient,HttpHeaders,HttpErrorResponse} from '@angular/common/http';
import {throwError } from 'rxjs';

import 'rxjs/add/operator/map';

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


  constructor(private http:HttpClient) { }

  registerUser(user){
    let headers = new HttpHeaders();
    headers.append('content-type','application/json');

    return this.http.post('http://localhost:8080/users/register',user,{headers:headers})
          .map(response =>response.json())
          .catch(this.errorHandler)

  }


  errorHandler(error:HttpErrorResponse){
     return throwError(error.message||"Server not responding");
  }

}

我什至像这样导入地图属性:

import {map} from 'rxjs/add/operator';

错误:

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

用户是一个对象

【问题讨论】:

    标签: angular typescript http rxjs mean-stack


    【解决方案1】:

    如果你使用的是 RXJS 6 或更高版本,操作符的用法会有所改变。

    您通过以下方式导入:

    import { map, catchError } from 'rxjs/operators';
    

    您在管道运算符内部使用地图,例如:

    return this.http.post('http://localhost:8080/users/register',user,{headers:headers})
          .pipe(
              map(response => {
                  // doSomething 
              }),
              catchError(error => {
                  this.errorHandler(error);
                  return of(`Caught an error: ${error}`);
              })
          );
    

    【讨论】:

    • 现在在 response.json() 上出现错误,即属性 'json' down 在类型 'object' 上不存在
    • @JoelJoseph 是对的,HttpClient 默认返回json,所以不需要调用json()。
    • 那么我怎么能调用 catch 或 catchError 函数 bcz 它给了 catch 函数同样的错误
    • @ShivaChandel 现在检查我的答案
    • @ShivaChandel 运行此代码时遇到什么错误?
    【解决方案2】:
    • 从 RxJS v6 及更高版本开始,不支持直接在 Observables 上调用运算符。请改用Observable.pipe
    • 从 RxJS v6 及更高版本开始,已弃用对直接导入运算符的支持。而是从rxjs/operators 导入。
    • HttpClient(来自@angular/common/http)默认将响应映射为 JSON。不需要map 运算符(这是Http 的前一种行为(来自@angular/http)。

    请参阅下面的更正示例:

    import { /* imports go here */ } from '@angular/common/http';
    // ...
    
    // ...
    export class AuthService {
      // ...
    
      registerUser(user){
        let headers = new HttpHeaders();
        headers.append('content-type','application/json');
    
        return this.http.post('http://localhost:8080/users/register',user,{headers:headers})
              .catch(this.errorHandler);
    
      }
    }
    

    【讨论】:

      【解决方案3】:

      如果你使用的是 RXJS 6 或更高版本,你必须管道操作

       this.http.post('http://localhost:8080/users/register',user,{headers:headers})
       .pipe(map(response => {
         // do something with response and return it
       })
       catchError(this.errorHandler)
        );
      

      如果您使用HttpClient 而不是Http,则不需要response.json(),因为响应将被反序列化为json。

      【讨论】:

      • 你试过我的答案了吗?
      • 是的,我做到了,但它不起作用,它给出了一个错误,即“对象”类型上不存在属性“json”
      • 没有必要使用.json作为我的答案
      • 这一步不用做response =&gt;response.json()
      • 正如您所说,HttpClient 默认将响应映射为 JSON。所以也不需要使用 .json() 和 pipe 但这会在我使用 .catch() 运算符时给出相同的错误
      猜你喜欢
      • 1970-01-01
      • 2020-03-12
      • 2018-10-16
      • 2019-01-09
      • 2018-06-25
      • 2020-07-13
      • 2019-04-11
      • 2018-11-04
      • 1970-01-01
      相关资源
      最近更新 更多