【问题标题】:How to use Backend Object in FrontEnd TypeScript (MEAN Stack)如何在前端 TypeScript 中使用后端对象(MEAN Stack)
【发布时间】:2018-03-08 07:29:49
【问题描述】:

使用 MongoDB、express.js、angular4、node.js

我检索的字符串很好检索,但与完整对象不同...

account.service.ts(完整,)

import { Injectable } from '@angular/core';
import { Http, Headers, Response } from '@angular/http';
import 'rxjs/Rx';
import { Observable } from 'rxjs/Observable';
const jwtDecode = require('jwt-decode');

import { User } from '../../models/user.model';
import { AuthService } from './auth.service';


@Injectable()
export class AccountService {
  constructor(private http: HttpClient,
              private authService: AuthService) {}

  user: any[];

  currentUser() {
    if(this.authService.isAuthenticated()){
      const token = localStorage.getItem('token');
      const decoded = jwtDecode(token);
      return decoded.user;
    }
  };

 getProfile() {
const id = this.currentUser();
return this.http.get("http://localhost:3000/user/" + id).
  map(
  (response: Response) => {
    const data = response.json();
    return data;
  }
)
  .catch(
    (error: Response) => {
      console.log(error);
      return Observable.throw(error.json());
    }
  )
}

user-profile.component.ts

export class UserProfileComponent implements OnInit {
  id: string;
  user: any;

  constructor(private account: AccountService) {}

  ngOnInit() {
    this.id = this.account.currentUser();
    this.user = this.account.getProfile()
      .subscribe(user => {
              this.user = user;
              return this.user;
            });
  }

  logUser() {
    console.log(this.id);
    console.log(this.user);
  }
}

user-profile.component.html

  <p>{{user}}</p>
  <p>User with ID {{id}} Loaded</p>
  <a (click)="logUser()">Log User Test</a>

HTML 文件显示:

[object Object]

User with ID 59ca916323aae527b8ec7fa2 Loaded

点击“登录用户”链接得到的是检索到的 ID 字符串和用户对象:

59ca916323aae527b8ec7fa2 [{...}] //单击它会显示对象的所有详细信息。

但是我无法完成获取这些详细信息并在 HTML 中显示它们的步骤,因为我使用 ID 成功管理...我的意思是,{{user.anything}} 不会获取用户的数据,因为它应该

我可以帮忙吗?

【问题讨论】:

  • 能否请您出示完整的 AccountService 课程?
  • 是的,我已经添加了完整的课程。

标签: node.js angular http typescript mean-stack


【解决方案1】:

将您的 getProfile() 更改为,

getProfile() {
    const id = this.currentUser();
    return this.http.get("http://localhost:3000/user/" + id).
      map(
      (response) => response.json()
    )
      .catch(
        (error: Response) => {
          console.log(error);
          return Observable.throw(error.json());
        }
      )
    }

另外,在ngOnInit()改这个,

this.user = this.account.getProfile()
      .subscribe((user) => {
              this.user = user;
            });

看看它是否给你正确的输出。

编辑

换这个,

this.user = this.account.getProfile()
          .subscribe((user) => {
                  this.user = JSON.parse(JSON.stringify(user));
                });

EDIT-2

this.user = this.account.getProfile()
              .subscribe((user) => {
                      this.user = JSON.stringify(user);
                      this.userObj = JSON.parse(JSON.stringify(user));
                      // also try, this.userObj = user; if above line didn't work
                    });

将组件中的另一个属性定义为,

userObj: any;

将模板中的对象称为this

{{ userObj[0]?.email }}

【讨论】:

  • 感谢您的回复。它就像以前一样工作 - 在用户配置文件组件中“LogUser”成功打印出 ID,并且用户对象也在 [{..}] 对象内检索(悬停在它上面说“对象”)
  • 在模板上试试这个:&lt;p&gt;{{ user | json }}&lt;/p&gt;。 (使用 json 管道)
  • 这将 html 输出从 [object Object] 更改为 [ { "_id": "59ca916323aae527b8ec7fa2", "gender": "male", "birthday": "2017-09-07", "电子邮件”:“test@test.com”,“密码”:“hashed.password”,“__v”:0,“名称”:{“名字”:“名称”,“中间名”:“测试”,“姓氏” ": "name" } } ] 并且还提供了一个错误:TypeError: Converting circular structure to JSON
  • 除了错误,这就是你要找的吗?
  • 这似乎是正确的方向......我向 ngOnInit 添加:this.user = JSON.stringify(user),然后在 HTML 上:{{user}} 给出与管道结果相同的结果,除了现在没有错误,但是 {{user.email}} 例如仍然没有显示...
猜你喜欢
  • 2017-06-15
  • 2018-07-02
  • 2015-03-01
  • 1970-01-01
  • 2021-10-21
  • 2020-01-27
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多