Observable Map 函数不是 运行(Angular2,http)

Observable Map function not running (Angular2, http)

更新

问题似乎是 "failed" 请求中的地图函数不是 运行。这意味着如果 API 我正在与 returns 通话,出现 422 Validation Failed 错误(或其他 4xx 错误)Angular 将把这视为失败并导致观察者 运行订阅的错误回调,过程中跳过map函数。

是否可以强制 Angular 将某些 4xx 错误视为成功请求,或者即使在 Observable returns 错误时也强制 map 函数 运行?


我的 Angular2 应用程序中有以下代码 运行ning:

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;
    });
}

代码执行正常,只是地图函数未触发。我没有收到任何错误,并且已经尝试使用 运行 和不使用 import 'rxjs/add/operator/map' 的代码,结果相同。我还尝试了一个更简单的地图函数 .map (res => res.json());.

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

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

回复:

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

我还针对完全成功的请求(状态代码:200)对其进行了测试,地图功能似乎工作正常。所以我猜只有 运行s 返回成功的响应。有没有办法让它达到 运行 无论如何,或者指定它应该 运行 的附加状态代码?

如评论所述,未调用 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"
}

希望对你有帮助, 蒂埃里