【问题标题】:trouble retrieving data from api on angular 2 service从 Angular 2 服务上的 api 检索数据时遇到问题
【发布时间】:2017-04-16 14:13:32
【问题描述】:

您好,我已经使用 Angular-cli 构建了一个项目,并且正在使用 express 在本地提供 API 路由。我有一个代理设置,因此角度客户端可以访问快速服务器。

我遇到的问题是从我的 API 路由中检索数据并将其传递给我的视图。我已经在我的服务中跟踪了我的数据,并且可以看到我的 observable 正在请求/接收数据对象。我还使用了模拟数据,并且看到我的视图/组件正确显示了数据。

我是否缺少帮助将 HTTP 请求从 Observable 传输到订阅的东西?我的项目没有显示任何错误,我不确定如何在 observable/subscribe 中测试我的应用。

我在另一个项目上有几乎相同的设置(唯一的区别是 HTTP 请求是针对本地 JSON 文件发出的,该项目通过快速 URL 请求它)并且该项目运行良好。

这是我的代码。

服务

import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';

export interface Session {
  title: string,
  date: string,
  description: string,
  imageUrl: string,
  thumbImageUrl: string,
  audioUrl: string,
  tracklist: [{
    title: string,
    artist: string
  }]
}

@Injectable()
export class DashboardService {
  private sessionsUrl = 'api/sessions';

  constructor(private http: Http) { }

  getSessions(): Observable<Session[]> {
    return this.http.get(this.sessionsUrl)
      .map(this.extractData)
      .catch(this.handleError);
  }

  private extractData(res: Response) {
    console.log(res.json()); // THIS SHOWS THAT THE JSON OBJECT IS BEING RETURNED
    let body = res.json();
    return body.project;
  }

  private handleError(error: Response | any) {
    let errMsg: string;
    if (error instanceof Response) {
      const body = error.json() || '';
      const err = body.error || JSON.stringify(body);
      errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
    } else {
      errMsg = error.message ? error.message : error.toString();
    }
    console.error(errMsg);
    return Observable.throw(errMsg);
  }
}

组件

import { Component, OnInit } from '@angular/core';
import { Session, DashboardService } from '../dashboard.service';

@Component({
  selector: 'sessions-display',
  templateUrl: './sessions-display.component.html',
  styleUrls: ['./sessions-display.component.scss']
})
export class SessionsDisplayComponent implements OnInit {
  sessions: Session[] = [];
  errorMessage: string;

  constructor(private dashboardService: DashboardService) { }

    ngOnInit() {
      this.getSessions();
    }

    getSessions() {
      this.dashboardService.getSessions()
        .subscribe(
        sessions => this.sessions = sessions,
        error => this.errorMessage = <any>error);
    }
}

这是显示 res 对象的 console.log 的图像。

【问题讨论】:

  • 你确定解析后的json响应有project字段吗?我的意思是,body 应该是 Array of Session no?
  • 对不起,我不太清楚你的意思。
  • 知道了,响应看起来是一个包含会话数组的对象。所以我相信它会正确返回。我将 console.log 与我正在运行的其他项目进行了比较,两者的格式相同。
  • 啊,你是对的。我不明白你最初想表达什么。

标签: angular angular2-services


【解决方案1】:

问题是我打错字了。 return body.project; 应该是 return body.sessions;

【讨论】:

  • 我就是这么说的:)
  • 哈,我知道,出于某种原因,直到我自己发现了错别字,我才发现它。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
相关资源
最近更新 更多