首页 文章

可观察的Map函数未运行(Angular2,http)

提问于
浏览
7

Update

问题似乎是map函数不在"failed"请求上运行 . 这意味着如果我正在谈论的API返回 422 Validation Failed 错误(或其他4xx错误),Angular会将此视为失败并导致Observer运行订阅的错误回调,从而跳过该过程中的map函数 .

是否有可能强制Angular将某些4xx错误视为成功请求,或强制映射函数即使在Observable返回错误时也能运行?


我在Angular2应用程序中运行以下代码:

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

...

public login (email : string, password : string) {
    return this.http.post(_endPoint + '/auth/login/', JSON.stringify({
        email: email,
        password: password
    }), {
        headers: new Headers({
            'Content-Type': 'application/json'
        })
    })
    .map (res => {
        let data = res.json();
        console.log(data);
        return data;
    });
}

代码执行正常,但不触发map函数 . 我没有得到任何错误,并尝试使用和不使用 import 'rxjs/add/operator/map' 运行代码具有相同的结果 . 我也尝试了一个更简单的 Map 功能 .map (res => res.json()); .

在这两种情况下,我希望 .subscribe() 函数中返回的结果是JSON响应,但我得到的是原始响应 .

Edit: 添加了请求数据和响应的屏幕截图

Request details

响应:

[{"field":"email","message":"Email or password incorrect."},{"field":"password","message":"Email or password incorrect."}]

我也在一个完全成功的请求(状态代码:200)上测试了它, Map 功能似乎工作正常 . 所以我想它只会在返回成功的响应时运行 . 有没有办法让它无论如何运行,或者指定它应该运行的其他状态代码?

1 回答

  • 7

    正如与注释所讨论的那样, map 方法未被调用,因为响应包含422状态代码,即错误 . 因此直接调用catch方法 .

    如果您需要提取与错误相对应的JSON内容,您可以在服务中尝试类似的内容:

    getCompanies() {
      return this.http.get('https://angular2.apispark.net/v1/companies1/', {
        headers: headers
      }).map(res => res.json()).catch(err => Observable.throw(err.json());
    }
    

    现在,在调用服务的组件中,您将能够订阅 . 在您的情况下,将使用响应的JSON内容调用第二个参数:

    service.getCompanies().subscribe(
      data => console.log('data = '+data),
      err => console.log('err = '+JSON.stringify(err, null, 2)), // <---
      () => console.log('complete')
    );
    

    印刷内容如下:

    err = {
      "code": 404,
      "description": "The server has not found anything matching the request URI",
      "reasonPhrase": "Not Found"
    }
    

    希望它对你有帮助,蒂埃里

相关问题