2017-02-06 7 views
2

Во-первых, я должен упомянуть, что я новичок в Angular, и я как бы зациклен на своем примере кода.Обработка исключений службы REST в Angular2

Я создал небольшое приложение для входа в систему, которое запрашивает имя пользователя и пароль, вызывает службу REST для входа в систему (написанную на Java), которая возвращает некоторый токен при успешном завершении входа в систему или выдает исключение при неудаче входа в систему.

Вот некоторые из моих кодов.

Войти компонент:

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

import { AuthenticationService } from '../_services/index'; 

@Component({ 
    moduleId: module.id, 
    templateUrl: 'login.component.html' 
}) 

export class LoginComponent implements OnInit { 
    model: any = {}; 
    error = ''; 

    constructor(
     private router: Router, 
     private authenticationService: AuthenticationService) { } 

    ngOnInit() { 
     // reset login status 
     this.authenticationService.logout(); 
    } 

    login() { 
     this.authenticationService.login(this.model.username, this.model.password) 
      .subscribe(result => { 
       if (result === true) { 
        this.router.navigate(['/']); 
       } else { 
        this.error = 'Login failed!'; 
       } 
      }, 
      err => { 
       this.error = 'Login failed!'; 
      }); 
    } 
} 

Служба аутентификации:

import { Injectable } from '@angular/core'; 
import { Http, Headers, RequestOptions, Response } from '@angular/http'; 
import { Observable } from 'rxjs'; 
import { CookieService } from 'angular2-cookie/core'; 
import { CookieOptionsArgs } from 'angular2-cookie/services/cookie-options-args.model'; 
import 'rxjs/add/operator/map'; 

@Injectable() 
export class AuthenticationService { 
    public token: string; 

    constructor(private http: Http, private cookieService: CookieService) { 
     // set token if saved in cookie 
     this.token = cookieService.get('token'); 
    } 

    login(username, password): Observable<boolean> { 
     return this.http.post('http://localhost:9081/MyApp/login?username=' + username + '&password=' + password, new RequestOptions({})) 
      .map((response: Response) => { 
       // login successful if there's a token in the response 
       let token = response.text(); 
       if (token !== '-1') { 
        // set token 
        this.token = token; 

        // store token in cookie to keep user logged 
        let opts: CookieOptionsArgs = { 
         path: '/' 
        }; 
        this.cookieService.put('token', token, opts); 

        // return true to indicate successful login 
        return true; 
       } else { 
        // return false to indicate failed login 
        return false; 
       } 
      }); 
    } 

    logout(): void { 
     // clear token, remove cookie to log user out 
     this.token= null; 
     this.cookieService.remove('token'); 
    } 
} 

Все работает, как ожидалось. Когда логин будет успешным, возвращается токен, и я перенаправляется на домашнюю страницу. В противном случае на странице входа появляется сообщение «Login falied», и перенаправление не происходит. Меня беспокоит то, что я точно не знаю, почему логин завершается с ошибкой: это потому, что имя пользователя не существует или может быть, потому что пароль неправильный. Каков правильный способ обработки исключений, переданных службой REST? Я предполагаю, что проверка подлинности является правильным местом, но я точно не знаю, как это сделать. Я попытался извлечь некоторую информацию из объекта запроса, но сопоставление запросов не происходит, если выбрано исключение.

Спасибо за помощь!

ответ

1

Кажется, что вы ищете возможность исключения исключения при регистрации ошибок в AuthenticationService. Если это так добавить .catch раздел после .map, как в этой теме: best practives catching error Angualr 2

 .catch((error: any) => {  //catch Errors here using catch block 
      if (error.status === 500) { 
       // Display your message error here 
      } 
      else if (error.status === 400) { 
       // Display your message error here 
      } 
     }); 
+0

В случае, если вы получаете сообщение об ошибке относительно Наблюдаемые для параметра улова, следуя поможет https://stackoverflow.com/questions/37472770/catch-is-not-working-for-http-get-angular2/37475643#37475643 – Nitin

0

я реализовал свой код таким образом:

login(email: string, password: string): Observable<boolean> { 
    return new Observable(observer => { 
     var data = { email: email, password: password }; 
     this.http.post(this.server_url + '/auth/authenticate', data).subscribe(x => { 
     var result = { 
      email: x.json().email, 
      token: x.json().token, 
      roles: x.json().roles.map(x => x.name) 
     } 
     localStorage.setItem(this._userKey, JSON.stringify(result)); 
     observer.next(true); 
     observer.complete(); 
     }, er => { 
     if (er.status == 401) { 
      observer.next(false); 
      observer.complete(); 
     } else { 
      console.log(er); 
      observer.error(er); 
      observer.complete(); 
     } 
     }); 
    }); 
    } 

так обрабатывать три возможности:

  1. , если он является закрытым, он возвращает true
  2. если учетные данные неверны, верните false (помните, что ваш сервер должен вернуть 401 статус)
  3. в противном случае существует проблема в сервере и бросить ошибку

и в обработчике я получил:

login() { 
    this.loading = true; 
    this.authenticationService.login(this.model.username, this.model.password) 
     .subscribe(result => { 
     if (result == true) {    
      this.router.navigate(['/home']); 
     } else { 
      this.error = 'Username or password is incorrect'; 
      this.loading = false; 
     } 
     }, err => { 
     this.error = 'Unexpected error occured.. please contact the administrator..'; 
     this.loading = false; 
     }); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^