【问题标题】:Return http status code in component from Service - Angular 2从服务返回组件中的 http 状态代码 - Angular 2
【发布时间】:2017-02-25 16:27:23
【问题描述】:

我在将 Http 服务中的对象返回到我的组件时遇到问题:

这是我的服务代码:

login(username,password){
        let headers = new Headers();
        headers.append('Content-Type','application/json');

        return this.http.post(this.configEnvironment.url() + "oauth/access_token",
            JSON.stringify(
                {
                    username: username,
                    password: password,
                    grant_type: "password",
                    client_id: "xxxx",
                    client_secret: "xxxxx"
                }
            ),
            { headers }
        )
        .map(res => res.json())
        .catch((err:Response) => {
            let details = err.json();

            return Observable.throw(details);
         });

     }

这是我的组件中的代码:

this.loginService.login(this.model.username,this.model.password)
            .subscribe(
                data => console.log(data),
                error => {
                    // var details = error.json();
                    console.log(error);
                },
                ()  =>  console.log("Finished")
            );

当我像这样返回 json 错误时它工作正常:

let details = err.json();
    return Observable.throw(details);

但是当我尝试像这样添加 http 响应状态代码时:

return  { status: err.status, error: Observable.throw(details) }

它给了我一个错误:

“'(err: Response) => { status: number; error: ErrorObservable; }' 类型的参数不能分配给'(err: any, catched: Observable) => ObservableInput'类型的参数. 输入'{状态:数字;错误:ErrorObservable; }' 不可分配给类型 'ObservableInput'。 输入'{状态:数字;错误:ErrorObservable; }' 不可分配给类型 'ArrayLike'。 类型'{ status: number; 中缺少属性'length';错误:ErrorObservable; }'。”

我的目标只是在 catch 的返回中包含 http 响应代码。

【问题讨论】:

    标签: angular angular2-services


    【解决方案1】:

    试试下面的代码,

    .catch((err:Response) => {
                let details = {detail:err.json(),status: err.status};
                return Observable.throw(details);
     });
    

    【讨论】:

    • 欢迎。只是想告诉你,昨天你问了一个问题,我回答了。答案是正确的,您立即将其删除。千万不要这样做,因为如果其他用户遇到同样的情况,这可能会帮助他们找出问题和解决方案。
    • 哎呀,对不起,伙计,是的,再也不会这样做了。再次感谢!
    【解决方案2】:

    试试这个

    return  [{ status: err.status, error: err.json() }]
    

    这应该可以工作

    或者您也可以简单地将整个 err 对象发送到 catch 块中,并在订阅时检查状态代码,这也可以。

     return  err
    

    在订阅时使用

    err.status

    【讨论】:

    • 没关系,很高兴听到你的回答,你也可以试试我的一个作为替代:)
    猜你喜欢
    • 1970-01-01
    • 2014-06-17
    • 2011-11-18
    • 1970-01-01
    • 2017-04-13
    • 2018-11-28
    • 2017-02-21
    • 2016-09-16
    • 2012-11-14
    相关资源
    最近更新 更多