【问题标题】:Why can I not call upon the property of this object? (Angular, MongoDB)为什么我不能调用这个对象的属性? (角,MongoDB)
【发布时间】:2018-05-22 22:20:10
【问题描述】:

我正在制作一个使用 MongoDB 数据库和 NodeJS 服务器的 Angular 应用程序。

我的想法是我创建一个应用程序,它现在只有一个帖子列表,旁边是详细帖子。这些组件很好地彼此相邻并且工作,但我有一个问题。当我尝试检索单个帖子时,我可以通过 console.dir(post) 看到一切都很好,并且该对象已传输到 Angular 应用程序。问题是当我尝试使用 post.content 时,我收到一条未定义的消息。

我已经搜索了几个小时,但似乎找不到原因。我将不胜感激您能给我的任何帮助。以下是所有信息,如果您需要查看其他信息,请告诉我。

提前致谢。

这是我要显示数据的 post-detail.component.html。

<div class="row">
<div class="col-xs-12">
<p>Content:</p>
<h1>{{ post.content }}</h1>
</div>
</div>

detail.ts 文件(我省略了导入)

    @Component({
  selector: 'app-post-detail',
  templateUrl: './post-detail.component.html',
  styleUrls: ['./post-detail.component.css']
})
export class PostDetailComponent implements OnInit {
  post: Post = new Post();
  id: string;

constructor(private postService: PostService,
            private route: ActivatedRoute,
            private router: Router) {
}

ngOnInit() {
  this.route.params
    .subscribe(
      (params: Params) => {
        this.id = params['id'];
        this.postService.getPost(this.id).then(res => {
          console.dir(res);
          console.dir(res.content);
          this.post = res;
        });
      }
    );
  }
}

我用来检索实际数据的 post.service.ts:

@Injectable()
export class PostService {
  postChanged = new Subject<Post[]>();

  private headers = new Headers({'Content-Type': 'application/json'});
  private serverUrl = environment.serverUrl + '/blogPosts/'; // URL to web api
  private posts: Post[];

  constructor(private http: Http) {
  }

  //this one DOES work
  getPosts() {
    console.log('Fetching BlogPosts from database.')
    return this.http.get(this.serverUrl, {headers: this.headers})
      .toPromise()
      .then(response => {
        this.posts = response.json() as Post[];
        return response.json() as Post[];
      })
      .catch(error => {
        return error;
      });
  }

  getPost(index: string) {
    console.log('Fetching individual BlogPost from database.');
    console.log('index' + index);
    if (index == null) {
      console.log('null');
      return null;
    }
    return this.http.get(this.serverUrl + index, {headers: this.headers})
      .toPromise()
      .then(response => {
        console.dir(response.json().content);
        console.dir(response.json());
        return response.json() as Post;
      })
      .catch(error => {

        return this.handleError(error);
      });
  }
}

后模型:

export class Post {

  private id: string;
  private _content: string;

  constructor(values: Object = {}) {
    Object.assign(this, values);
  }
  public get _id(): string {
    return this.id;
  }

  public set _id(n: string) {
    this.id = n;
  }

  public get content(): string {
    return this._content;
  }

  public set content(n: string) {
    this._content = n;
  }
}

我在 Postman GET /blogPost/id 和控制台日志中添加了图像。 谢谢!

Console log

Postman GET route

【问题讨论】:

  • {{ post._content }} 是否可以进行更改? undefined 这意味着它没有任何价值。你从端点收到什么?顺便说一句,为什么你只为 _content 而不是 id 使用命名约定 '_' ?我不是说它错了,但它背后的逻辑是什么?
  • @DrNio 这是我从课程中获得的入门包,我自己没有命名。但正如您在我的控制台中看到的,该属性称为“内容”,而不是“_content”。
  • 是的,我在控制台中看到了它,但是在您在组件(异步)操作中接收它之前,您需要使用具有 _content 属性的 new Post() 对其进行初始化。这让我有点困惑。这又是一个想法 - 我不确定这是否是问题

标签: node.js mongodb angular mongoose


【解决方案1】:

我可能错了,但您能否将服务中的任何地方的 _content 更改为 content

编辑:当您调用服务方法时,您确定this.id 是正确的吗?因为如果是null or undefined,那么return null会被执行。

另一个注意事项是,在 Postman 中,我看到在此示例中响应是一组对象(一个对象)。您可以在组件中尝试this.post = res[0]; 吗?

【讨论】:

  • 我会试试这个,完成后我会回复你。
  • 很遗憾,这没有帮助
【解决方案2】:
return response.json() as Post;

在 post.service.ts 中应该是:

return response.json()[0] as Post;

我没有看到该对象被包装在一个数组中,通过访问它我能够将它取出并使用它。

【讨论】:

  • 确实如此,或者您可以按照我的建议在组件中执行此操作,它应该可以工作 - 如果您愿意,您也可以将其标记为答案
猜你喜欢
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多