Angular5 httpClient get:无法读取属性&to to ofLowerCase'未定义的

时间:2018-02-27 17:05:53

标签: angular httpclient angular5

我正在尝试从API获取用户列表,但是我收到以下错误:

/project/svn/log/*.log {  # path changed
...
  create 644 svn svn   # corrected group and made world-readable
...

我有一个调用homeService.getUsers()的登录组件,该组件使用HttpClient检索用户,但http请求永远不会到达服务器。

login.component.ts:

sudo mkdir /project/svn
sudo chmod 755 /project/svn
sudo mkdir /project/svn/repos /project/svn/log
sudo chown -R svn:svn /project/svn
sudo semanage fcontext -add --type svnserve_content_t "/project/svn(/.*)?"
sudo restorecon -Rv /project/svn

Home.service:

TypeError: Cannot read property 'toLowerCase' of undefined
at HttpXsrfInterceptor.intercept (http.js:2482)
at HttpInterceptorHandler.handle (http.js:1796)
at HttpInterceptingHandler.handle (http.js:2547)
at MergeMapSubscriber.eval [as project] (http.js:1466)
at MergeMapSubscriber._tryNext (mergeMap.js:128)
at MergeMapSubscriber._next (mergeMap.js:118)
at MergeMapSubscriber.Subscriber.next (Subscriber.js:92)
at ScalarObservable._subscribe (ScalarObservable.js:51)
at ScalarObservable.Observable._trySubscribe (Observable.js:172)
at ScalarObservable.Observable.subscribe (Observable.js:160)

和app.module:

import { Component, OnInit } from '@angular/core';

import { HomeService } from '../service/home.service';
import { User } from '../domain/user';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.scss']
})
export class LoginComponent implements OnInit {

  user: User = {
      id: undefined,
      userName: undefined,
      password: undefined
  }; 
  users: User[];

  constructor(
    private homeService: HomeService
  ) { }

  ngOnInit() {
    this.getUsers();
  }

  getUsers(): void {
    this.homeService.getUsers()
    .subscribe(users => this.users = users);
  }
}

我可以看到日志记录中显示的错误消息,所以它似乎是来自HttpClient的错误。但是在将Http请求发送到服务器之前,我无法弄清楚它为什么会失败。

6 个答案:

答案 0 :(得分:7)

我遇到了同样的问题。问题是我已经声明了url,但是在做httpget时,我意识到url没有被分配任何值:

可能案例: 例: private yourUrl:string;

并在你的http电话中: 返回this.http.get(this.yourUrl,{headers:this.headers})

答案 1 :(得分:5)

似乎您错误地声明了一个变量,从而使它未定义: 试试这个

用于简洁编码

interface User = {
      id: number;
      userName: string;
      password: string;
  }

user: User;

也请改正此行

private usersUrl: 'http://localhost:8080/users';

收件人

private usersUrl =  'http://localhost:8080/users';

这可能是问题所在

答案 2 :(得分:1)

问题与您传递的URL有关: private usersUrl: http://localhost:8080/users';

应为: private usersUrl: string='http://localhost:8080/users';

答案 3 :(得分:0)

我遇到了同样的问题。 正如@Canlla所说,有必要将url变量的可见性从public更改为private。

  

奇怪,但有些东西正在改变它的价值!无论如何,它一定是   私有,因为我们不需要在模板上访问它。

就我而言,我需要添加NgIf / NgElse以避免在加载完成之前绑定数据:

<mat-list *ngIf="transactions | async; let transactions;else loading">
      <div *ngFor="let transaction of transactions">
        <h3 mat-subheader>{{ transaction.dueDate }}</h3>        
        <mat-list-item>
          <img matListAvatar src="https://source.unsplash.com/random/100x100" alt="...">
          <span matLine class="mat-body-2"> {{transaction.description}} </span>
          <p matLine class="col col-6 left-align">
            <span class="mat-body-1"> {{transaction.categoryName}} </span>
            <br>
            <span class="mat-caption"> {{transaction.accountName}} </span>
          </p>
          <p class="col col-6 right-align">
            <span class="mat-subheading">{{ transaction.amount | currency:'BRL':'symbol' }}</span>
          </p>
        </mat-list-item>       
      </div>
    </mat-list>

<ng-template #loading>Loading...</ng-template>

所以这里: <mat-list *ngIf="transactions | async; let transactions;else loading">

如果async已加载,我有{ngIf与mat-list管道显示transactions。 Next let user语句如果为true,则创建一个Angular从Observable中分配值的本地模板变量。

否则else loading告诉Angular是否满足条件以显示加载模板。

查看来自@coryrylan的这篇优秀帖子:https://coryrylan.com/blog/angular-async-data-binding-with-ng-if-and-ng-else

答案 4 :(得分:0)

我认为您的网址声明不正确 请尝试以下方式:

private usersUrl = 'http://localhost:8080/users';

答案 5 :(得分:0)

我也遇到了类似的错误,为了解决这个问题,我抬起头来发现自己错误地声明了URL。

声明应该像这样

private urlVariable = 'http://sampleurl.com';