【问题标题】:How to let angular frontend wait for express REST-Call response如何让角度前端等待快速 REST-Call 响应
【发布时间】:2019-07-04 17:25:34
【问题描述】:

我想在初始化用户组件时进行 REST-Call,以便在加载时显示用户配置文件。这工作正常,组件调用调用我的快速后端的服务,该后端又调用返回用户配置文件的 REST-API。然后前端得到更新。

但是,我收到一个 javascript 错误,因为前端尝试在发送数据之前在用户组件 html 模板中使用 user.id:

UserComponent.html:2 ERROR TypeError: Cannot read property 'id' of undefined
    at Object.eval [as updateRenderer] (UserComponent.html:2)
    at Object.debugUpdateRenderer [as updateRenderer] (core.js:20458)
    at checkAndUpdateView (core.js:19833)
    at callViewAction (core.js:20069)
    at execComponentViewsAction (core.js:20011)
    at checkAndUpdateView (core.js:19834)
    at callViewAction (core.js:20069)
    at execComponentViewsAction (core.js:20011)
    at checkAndUpdateView (core.js:19834)
    at callViewAction (core.js:20069)

我试图通过添加我希望在加载用户时使用的默认值来解决此问题 这是我的 HTML:

<ul>
  <li>id: {{user.id ? user.id : ''}}</li>
  <li>name: {{user.firstName ? user.firstName : ''}} {{user.lastName ? user.lastName : ''}}</li>
  <li>mail: {{user.email ? user.email : ''}}</li>
</ul>

这里是component.ts

@Component({
  selector: 'app-user',
  templateUrl: './user.component.html',
  styleUrls: ['./user.component.css']
})
export class UserComponent implements OnInit {
  user: User;

  constructor(private userService: UserService) { }

  ngOnInit() {
    this.userService.getUser().subscribe(user => {
      console.log('myUser: ' + JSON.stringify(user));
      this.user = user;
    });
  }

}

service.ts

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { map, catchError, tap } from 'rxjs/operators';

import { User } from '../classes/user';

@Injectable({
  providedIn: 'root'
})
export class UserService {
  constructor(private http: HttpClient) {  }

  getUser(): Observable<User> {
    return this.http.get<any>('/api/userprofile');
  }
}

和服务器端代码

router.get('/userprofile', (req, res) => {
  axios.get('https://somerestapi', {auth: {username: 'authuser', password: 'authuserpw'}})
    .then(response => {
      res.status(200).json(response.data)
    })
    .catch(error => {
      res.status(500).send(error);
    })
})

提前致谢!

【问题讨论】:

    标签: javascript angular rest express axios


    【解决方案1】:

    要么将 *ngIf="user" 放在 ul 元素上。或者在 html 中的每个 user 后面加上问号。 &lt;li&gt;id: {{user?.id}}&lt;/li&gt;

    【讨论】:

    • 只检查 ngIf 中的用户对象就足够了。非常感谢!
    【解决方案2】:
    <ul *ngIf="user">
      <li>id: {{user.id ? user.id : ''}}</li>
      <li>name: {{user.firstName ? user.firstName : ''}} {{user.lastName ? user.lastName : ''}}</li>
      <li>mail: {{user.email ? user.email : ''}}</li>
    </ul>
    

    您可以在 ngOnInit 中调用函数,如下所示

     ngOnInit() {
        this.userService.getUser().subscribe(user => {
          console.log('myUser: ' + JSON.stringify(user));
          this.assignUser(this.user) ;
        });
      }
      //function to assinging user value
          assignUser(user){
          this.user= user;
          }
    

    【讨论】:

      【解决方案3】:

      尝试使用下面的html sn-p:

      <ul>
        <li>id: {{user?.id}}</li>
        <li>name: {{user?.firstName}} {{user?.lastName}}</li>
        <li>mail: {{user?.email}}</li>
      </ul>
      

      或者

        <ul *ngIf="user.length >0">
        <li>id: {{user.id ? user.id : ''}}</li>
        <li>name: {{user.firstName ? user.firstName : ''}} {{user.lastName ? user.lastName : ''}}</li>
        <li>mail: {{user.email ? user.email : ''}}</li>
      </ul>
      

      【讨论】:

        【解决方案4】:

        尝试检查user数组的长度

        <ul *ngIf="user.length >0">
          <li>id: {{user.id ? user.id : ''}}</li>
          <li>name: {{user.firstName ? user.firstName : ''}} {{user.lastName ? user.lastName : ''}}</li>
          <li>mail: {{user.email ? user.email : ''}}</li>
        </ul>
        

        【讨论】:

        • 谢谢,这也有效。有什么理由我应该检查长度而不是只检查用户对象本身?
        猜你喜欢
        • 2019-11-17
        • 1970-01-01
        • 2019-05-23
        • 2011-02-19
        • 2018-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多