【问题标题】:Get error message from Angular 2 http从 Angular 2 http 获取错误消息
【发布时间】:2016-02-27 11:23:05
【问题描述】:

我的服务中有以下代码

myService.ts

makeHttpGetRequest(url){

        return Observable.interval(config.SUPERVISOR_REFRESH_INTERVAL * 1000)
            .switchMap(() => this.http.get(url))
            .map(res => res.json())
            .timeout(config.REQUEST_TIMEOUT * 1000, new Error('Time out occurred'))

    }

在我的组件文件中,

myComponent.ts

ngOnInit(){
        this._myService.makeHttpGetRequest(myurl)
            .subscribe(
                data => {
                    this.supervisorServers = data;
                    }

                },
                error => {
                    this.error = true;
                    console.log(error); //gives an object at this point
                    this.showError(error);
                }
            );
    }

我想打印错误消息以防例如网址无效。 当我打印错误时,我得到一个对象(可能是响应对象),如下所示:

Object { _body: error, status: 200, statusText: "Ok", headers: Object, type: 3, url: null }

如果我打开它,我找不到错误消息。有没有更好的方法来获取 precies 错误消息?

【问题讨论】:

    标签: http angular


    【解决方案1】:

    即使在这种情况下,错误也包含在响应正文中。查看错误事件处理函数 onError 函数:

    您可以在响应中使用 json 方法访问它:

    error => {
      this.error = true;
      console.log(error.json()); //gives the object object
      this.showError(error.json());
    }
    

    编辑

    我对这个问题进行了更多调查。实际上,您无法获得确切的信息。我的意思是net::ERR_NAME_NOT_RESOLVED。 XHR 不提供它。也就是说,您可以看到 XHR 的 status0。这可能暗示发送请求时请求存在问题(实际上并未发送)。

    error => {
      (...)
      var err = error.json();
      var status = err.currentTarget.status;
      (...)
    }
    

    看到这个问题:

    【讨论】:

    • 感谢您的回复。我可以访问它。但是对于例如当我的网址无效时,我在响应正文中看不到错误消息。是否可以获得在 UI 上显示的错误消息?
    • 不客气!事实上,您无法获得确切的消息,因为在 XHR 对象中无法访问它。也就是说,您可以依赖此对象的 status 字段...我更新了答案。
    【解决方案2】:

    我尝试 error.error 并为我工作。它得到对象消息错误。

    编辑:

    对不起!!

    试试这个:

                error => {
                    this.error = true;
                    console.log(error.error); 
                    this.showError(error.error);
                }
    

    【讨论】:

    • 您应该添加更多细节以使您的答案更适合上下文
    【解决方案3】:

    使用 Angular 5+ 你实际上可以只使用error.message

     error => {
                    console.log(error.message); 
                    this.showError(error.message);
              }

    在我的情况下,我正在使用带有警报的 Ionic 3

     error => {
            loading.dismiss();
            let alert = this.alertCtrl.create({
            title: 'Error: ',
            message:  error.message,//Displays http error message in alert
            buttons: [
                         {
                            text: 'Dismiss',
                            role: 'Yes',
                            handler: () => {}
                         }
                      ]
                    });
                 alert.present();
                 }

    这里是记录时控制台中错误对象的 sn-p:

    【讨论】:

    • error.message 也为我提供了堆栈跟踪的很大一部分。我不想要那部分。我可以使用 split('at') 对其进行子串化,但这种方式不干净是吗?我希望有一个更好的解决方案来解决这个问题。
    • @arm 这最终取决于您收到的错误类型。我有一些消息不存在的实例,但您可以浏览 error.message 实例或根据错误类型设置案例以获取您需要的内容。
    【解决方案4】:

    您可以将错误对象字符串化以打印其字符串值

    const errStr = JSON.stringify(error);
    console.log(errStr); 
    

    【讨论】:

      猜你喜欢
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2016-12-30
      • 1970-01-01
      • 2018-01-21
      • 2017-06-08
      相关资源
      最近更新 更多