내가 노력하고 있을지도에서`서비스 호출을 하지만 오류가 있습니다. 보 https://stackoverflow.com/questions/41995647/subscribe-is-not-defined-in-angular-2 고 그것을 말하기 위해서는 가입하가 필요로 돌아서는 내부에 연산자입니다. 나는 돌아 문니다.
여기's 내 코드:
checkLogin(): Observable<boolean> {
return this.service.getData()
.map(
response => {
this.data = response;
this.checkservice = true;
return true;
},
error => {
// debugger;
this.router.navigate(['newpage']);
console.log(error);
return false;
}
)
.catch(e => {
return e;
});
}
오류 로그:
TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable
나의 케이스에서 오류가 발생한하는 동안에만 e2e 테스트합니다. 그것에 의해 발생했throwError
내 AuthenticationInterceptor.
내가 가져온에서 잘못된 원본을 사용했기 때문에 WebStorm's 가져오는 기능입니다. 내가 사용하 RxJS6.2.
잘못된:
import { throwError } from 'rjxs/internal/observable/throwError';
정:
import { throwError } from 'rjxs';
여기에는 전체 코드의 요격:
import { Injectable } from '@angular/core';
import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
@Injectable()
export class AuthenticationInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const reqWithCredentials = req.clone({withCredentials: true});
return next.handle(reqWithCredentials)
.pipe(
catchError(error => {
if (error.status === 401 || error.status === 403) {
// handle error
}
return throwError(error);
})
);
}
}
에서 당신의 예제 코드에,당신은 당신의 지도자를 받는 두 개의 콜백을 때,수있는 기능을 제공합니다 받는 하나입니다. 이동할 수 있습니다 당신의 오류 처리 코드를 잡을 콜백입니다.
checkLogin():Observable<boolean>{
return this.service.getData()
.map(response => {
this.data = response;
this.checkservice=true;
return true;
})
.catch(error => {
this.router.navigate(['newpage']);
console.log(error);
return Observable.throw(error);
})
}
You'해야도 가져오는잡아
와throw
연산자입니다.
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
편집: 참고는 반환하여`관찰할 수 있어야 합니다.던인 잡는 핸들러를't 실제로는 오류를 캡처니다-그것은 여전히 표면 콘솔에.
당신이 돌아 Observable
.map(response => <boolean>response.json())
를 사용하는 경우 다른 일반적인 서비스checkservice
당신의 경우에,당신은 단순히 사용
this.service.getData().subscribe(data=>console.log(data));
이checkLogin()
기능으로 반환을 입력으로 무효
checkLogin():void{
this.service.getData()
.map(response => {
this.data = response;
this.checkservice=true;
}).subscribe(data=>{ });
사용할 수 있습니의이다.checkService
을 확인하는 귀하의 상태
는 경우에 당신의 기능을 기대를 반환하는 부울,다음과 같이 하면 됩니다:
import { of, Observable } from 'rxjs';
import { map, catchError } from 'rxjs/operators';
checkLogin(): Observable<boolean> {
return this.service.getData()
.pipe(
map(response => {
this.data = response;
this.checkservice = true;
return true;
}),
catchError(error => {
this.router.navigate(['newpage']);
console.log(error);
return of(false);
})
)}
나는 이 문제에 직면하려고 할 때 사용자를 인증하기 위해 사용 웹 토큰을 발급합니다. 내 경우에는 그's 관련 인증 interceptor.
보내는 요청을 사용자를 인증하지 않't 를 제공해야 토큰지 않기 때문't 존재하는 아직이다.
을 확인하는 귀하의 요격을 포함 this:
if (req.headers.get('No-Auth') == "True")
return next.handle(req.clone());
그리고 당신을 제공하{'No-Auth':'True'}`헤더's 요청은 다음과 같다:
authenticateUser(user): Observable<any> {
const headers = new HttpHeaders({'No-Auth':'True'});
headers.append('Content-Type', 'application/json');
return this.httpClient.post(`${this.apiEndpoint}/auth/authenticate`, user, {headers: headers});
}
이 때문에 나는 여기에 도착한 위해 찾고 동일하고,오류를 이것이 유용할 수 있에서 누군가를 위한 미래입니다.
나는 같은 오류가 발생을 초기화하는 동안 서비스의 변수에서 생성자를 호출하여 원격 API 를 통 http.을 얻고.구독()
후에 많은 테스트를 이해 하지 않고 무엇이 문제,내가 마침내 그것을 얻을: 내 응용 프로그램 인증 및HttpInterceptor,을 초기화 서비스 호출하면 공개 API 를 사용하는 방법http.을 얻(...)지 않고'No-Auth'헤더가 있습니다. 내가 그들을 여기에,그리고 문제 해결을 위한 저:
getData() {
var reqHeader = new HttpHeaders({ 'Content-Type': 'application/x-www-urlencoded','No-Auth':'True' });
return this.http.get(environment.urlApi.Literales, { headers: reqHeader });
}
무엇을 두통:(
내가 똑같은 오류 메시지는 동안 나는 하 나의 단위 테스트 및 던지는 관찰된 후에는 예외를 조롱하고 내 서비스입니다.
나는 그것을 해결에 전달하여 정확한 기능 및 형식으로 내부관찰할 수 있어야 합니다.을 던져
.
실제 코드는 전화 서비스 그리고구독
을 얻는 데이터입니다. 알 수 있는잡을
을 처리하400
오류가 있습니다.
this.search(event).catch((e: Response) => {
if (e.status === 400) {
console.log(e.json().message);
} else if (e.url) {
console.log('HTTP Error: ' + e.status + ' ' + e.statusText,
'URL: ' + e.url, 'Info: ' + e.json().message));
}
}).finally(() => {
this.loading = false;
}).subscribe((bData) => {
this.data = bData;
});
코드가 내부에 서비스
search() {
return this.someService.getData(request)
.do((r) => {
this.someService.defaultHeaders.delete('skipAlert');
return r;
})
.map((r) => {
return r.businessObjectDataElements.length && r.businessObjectDataElements || null;
});
}
나는 조롱 SomeService 고 돌아온 데이터 관찰하고 그것으로 모든 필요한 방법이다.
someServiceApi = fixture.debugElement.injector.get(SomeService);
spyOn(someServiceApi, 'getData').and.returnValue(Observable.of({}));
위의 코드입니다 좋아요 하지만 때가 되었을 테스트하기 위해 노력하고 catch/오류 조건에 의해 전달하는관찰할 수 있어야 합니다.throw({})
그것을 보여주는 저를 오류로 기대하고 있었응답
입력 return 에서 서비스입니다.
그래서 아래에 서비스를 조롱하는 반환되었을 주는 오류가 있습니다.
someServiceApi.getData
.and.returnValue(Observable.throw(new Response({status: 400, body: [], message: 'not found error'})));
그래서 나는 그것을 수정하여 정확한 복제를 예상된 기능에 돌아온 나는 개체 오히려 전달하는응답
입력 값입니다.
someServiceApi.getData
.and.returnValue(Observable.throw({status: 400, json: () => { return {message: 'not found error'}}, body: []}));
// see `json: () => { return {message: 'not found error'}}` inside return value