programing

오류 유형:스트림이 필요한 곳에 잘못된 개체를 제공했습니다.관측 가능, 약속, 배열 또는 반복 가능한 값을 제공할 수 있습니다.

linuxpc 2023. 9. 13. 22:21
반응형

오류 유형:스트림이 필요한 곳에 잘못된 개체를 제공했습니다.관측 가능, 약속, 배열 또는 반복 가능한 값을 제공할 수 있습니다.

전 그러려고 합니다.map서비스 호출에서 오류가 발생했습니다.구독하기는 각 2에 정의되어 있지 않으며, 구독하기 위해서는 운영자 내부에서 복귀해야 한다고 합니다.반품 명세서도 가지고 있습니다.

제 암호는 이렇습니다.

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;
    });
}

오류 로그:

오류 유형:스트림이 필요한 곳에 잘못된 개체를 제공했습니다.관측 가능, 약속, 배열 또는 반복 가능한 값을 제공할 수 있습니다.

저의 경우 e2e 테스트 중에만 오류가 발생하였습니다.그것은 원인이었습니다.throwError내 인증에서인터셉터.

웹스톰의 가져오기 기능을 사용해서 잘못된 소스에서 가져온 것입니다.저는 RxJS 6.2를 사용하고 있습니다.

틀렸습니다:

import { throwError } from 'rxjs/internal/observable/throwError';

정답:

import { throwError } from 'rxjs';

요격기의 전체 코드는 다음과 같습니다.

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);
        })
     );
  }
}

당신의 예제 코드에서 당신은 당신의map교환원이 콜백을 두 번 받는 경우, 한 번만 받아야 합니다.오류 처리 코드를 캐치콜백으로 이동할 수 있습니다.

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);
                       })
   }

당신은 또한 수입할 필요가 있을 것입니다.catch그리고.throw오퍼레이터들.

import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';

EDIT: 주의할 점은 다음과 같습니다.Observable.throw캐치 핸들러에서는 실제로 오류를 포착하지 못합니다. 여전히 콘솔에 표시됩니다.

함수에서 부울을 반환할 것으로 예상되는 경우 다음 작업만 수행합니다.

  1. 가져오기:
import { of, Observable } from 'rxjs';
import { map, catchError } from 'rxjs/operators';
  1. 그리고나서
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);
      })
)}

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=>{ });

사용할 수 있습니다.this.checkService자신의 상태를 체크하다

프로젝트마다 RxJS 버전이 다를 때 이 오류가 발생했습니다.RxJS의 내부 검사에 실패하는 이유는 여러 가지가 있기 때문입니다.Symbol_observable. 결국함수는 다음과 같은 평탄화 연산자로부터 호출을 받습니다.switchMap.

일부 진입 지점에서 심볼 관측 가능한 것을 가져오십시오.

// main index.ts
import 'symbol-observable';

나는 다른 관측 가능한 것을 돌려주는 것을 잊고 있었습니다.pipe(switchMap(

this.dataService.getPerson(personId).pipe(
  switchMap(person => {
     //this.dataService.getCompany(person.companyId); // return missing
     return this.dataService.getCompany(person.companyId);
  })
)

operator Change가 아닌 'takeTill' 내부 버전을 가져오면서 동일한 문제가 발생했습니다.

import { takeUntil } from 'rxjs/internal/operators/takeUntil';

로.

import { takeUntil } from 'rxjs/operators';

이는 다른 운영자들에게도 발생합니다.

stray coma()로 트리거할 수 있습니다.,) RxJS에서pipe(...)

컴파일은 마지막에 이 추가 쉼표를 잡지 못합니다.

pipe(first(), map(result => ({ event: 'completed', result: result}),);

그것은 '보이지 않는 것'이 됩니다.undefined파이프 전체를 나사로 고정시키고 매우 혼란스러운 오류 메시지를 발생시키는 연산자입니다. 이 경우에는 실제 논리와는 아무런 관련이 없습니다.

이것을 경험하는 사람들을 위한 힌트.이런 일이 일어날 수 있습니다.switchMapnull과 같이 관측 가능한 반환 값을 받지 못합니다.기본 케이스를 추가하기만 하면 항상 관측치가 반환됩니다.

        switchMap((dateRange) => {
          if (dateRange === 'Last 24 hours') {
            return $observable1;
          }
          if (dateRange === 'Last 7 Days') {
            return $observable2;
          }
          if (dateRange === 'Last 30 Days') {
            return $observable3;
          }
          // This line will work for default cases
          return $observableElse;
        })

JSON Web Token을 사용하여 사용자를 인증하려고 할 때 이 문제가 발생했습니다. 제 경우는 인증 가로채기와 관련이 있습니다.

사용자를 인증하기 위해 요청을 보내는 것은 토큰이 아직 존재하지 않기 때문에 토큰을 제공할 필요가 없습니다.

인터셉터에 다음이 포함되어 있는지 확인합니다.

if (req.headers.get('No-Auth') == "True")
            return next.handle(req.clone());

그리고 당신이 제공하는 것은{'No-Auth':'True'}당신의 헤더의 요청에 다음과 같이 대답합니다.

  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});
  }

저는 같은 오류를 찾아 이곳에 도착하기 때문에 이 글을 썼고, 이것은 미래의 누군가에게 유용할 수 있습니다.

http.get 및 .subscribe()를 통해 원격 API로 호출하는 생성자의 서비스 변수를 초기화하는 동안 동일한 오류가 발생합니다.

문제가 무엇인지 이해하지 못한 채 여러 번의 테스트를 거쳐 마침내 알 수 있었습니다. 애플리케이션에 인증과 HttpInterceptor가 있었고, 'No-Auth' 헤더가 없는 http.get(...)사용하여 퍼블릭 API 메서드를 호출하는 서비스를 초기화하려고 했습니다.여기에 추가하면 문제가 해결됩니다.

getData() {
var reqHeader = new HttpHeaders({ 'Content-Type': 'application/x-www-urlencoded','No-Auth':'True' });    
return this.http.get(environment.urlApi.Literales, { headers: reqHeader });  
}

머리가 아프네요 :(

유닛 테스트를 할 때와 내 서비스를 조롱한 후 관찰 가능한 예외를 던지는 동안 나는 똑같은 오류 메시지를 받았습니다.

내부에 정확한 기능과 형식을 전달하여 해결하였습니다.Observable.throw.

서비스를 호출하는 실제 코드와subscribe데이터를 얻기 위해서 입니다.을 알아차리다catch일을 처리하다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/error 조건을 테스트하려고 했을 때 pass.Observable.throw({})그것은 예상했던 것과 같이 나에게 오류를 보여주고 있었습니다.Response서비스에서 반환을 입력합니다.

그래서 아래 서비스에서 조롱하는 리턴은 저에게 그 오류를 주고 있었습니다.

someServiceApi.getData
  .and.returnValue(Observable.throw(new Response({status: 400, body: [], message: 'not found error'})));

그래서 나는 내 리턴 오브젝트에 정확하게 예상되는 기능을 복제하여 수정했습니다.Response활자값

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

Angular-5에 있는 저의 경우, 제가 메소드에 액세스하고 데이터를 구독하는 서비스 파일을 가져오지 않았습니다.서비스 파일을 가져온 후에는 정상적으로 작동했습니다.

이 오류는 내가 인터셉터를 사용할 때 발생했습니다. 당신은 인터셉터에서 이것을 해야 합니다.

return next.handle(request).map(event => {
        if (event instanceof HttpResponse) {

        }
        return event;
    },
      catchError((error: HttpErrorResponse) => {
        if (error.status === 401 || error.status === 400) {
          // some logic

        }

이 오류는 나에게 발생했습니다 @angular 7.

스트림이 필요한 곳에 잘못된 개체를 제공했습니다.관측 가능, 약속, 배열 또는 반복 가능을 제공할 수 있습니다.

오류는 사실 설명할 수 있는.somewhere관측 가능한 곳에서 나는 유효하지 않은 물체를 넘겼습니다.저의 경우, API 호출이 많았는데 서버 구성이 잘못되어 호출이 모두 실패하고 있었습니다.사용하려고 했습니다.map,switchMap 다른 되지 않은개체를 가져옵니다. , rxjs 이지만 가 되지 를 를 이지만 되지

따라서 rxjs 연산자 입력을 다시 확인합니다.

switchMap 내부에서 method를 호출할 때도 같은 문제에 직면했는데, switchMap 내부에서 method를 사용하면 관측 가능한 상태로 반환해야 한다는 것을 알게 되었습니다.

저는 파이프를 사용하여 관측 가능한 것을 반환하고 맵을 사용하여 내부 방식으로 API 호출을 수행하는 것이 아니라 내부 방식으로 수행하고 있었습니다.

이것이 누군가에게 도움이 될지는 모르겠지만, 제 경우에는 제가 사용하고 있던 체인 위로 말입니다.distinctUntilChanged함수 내부에서 예외가 발생했는데 이 오류 메시지가 표시됩니다.

Observable을 예상하는 연산자에게 정의되지 않은 정보를 제공하면 다음과 같은 오류 메시지가 나타납니다(예: take then).

TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable 

내 경우엔 에픽이 아니라 액션을 내 콤바인 에픽으로 잘못 들여왔거든요...

콤바인 에픽 내의 모든 기능이 에픽 기능인지 확인합니다.

NESTJS에서 RXJS를 사용한 것과 비슷한 오류가 있었습니다.

Error: TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable. +1ms

제 경우 스위치 맵에서 Observable을 반환하는 것을 잊어버렸습니다.이로 인해 다음 RXJS 연산자 또는 클라이언트 코드에서 Observable이 수신되지 않았습니다.

switchMap에서 Observable을 반환하자 오류가 사라졌습니다.

다른 문제로 같은 오류가 발생했습니다. 그래서 저는 여기서 제 해결책에 답하고 있습니다. 그래서 사람들이 같은 것을 검색할 때 이것을 볼 수 있습니다.

Supabase + Ionic Auth 자습서를 따라 이메일 검증(각 반응 양식 포함)을 추가하고 싶었습니다.Validation-Group을 다음과 같이 정의했습니다.

  credentials = this.fb.nonNullable.group({
                  email: ['', Validators.required, Validators.email],
                  password: ['', Validators.required],
  })

그리고 Validators.email을 추가했을 때 갑자기 오류가 발생했습니다. Validators-lib을 실제로 본 적은 없지만, 두 번째 Validators-lib을 어레이로 통과해야 한다는 것을 확인했습니다.y['', Validators.required, Validators.email]['', [Validators.required, Validators.email]]문제를 해결했습니다!

작업 솔루션:

  credentials = this.fb.nonNullable.group({
                  email: ['', [Validators.required, Validators.email]],
                  password: ['', Validators.required],
  })

스트림이 예상되는 위치에 잘못된 개체를 제공했습니다. 관찰 가능, 약속, 배열 또는 반복 가능" 오류를 제공할 수 있습니다.

이런 일이 일어날 수도 있습니다.import { Observable } from 'rxjs' 실제로 사용하는 모듈/기능/인스턴스를 사용한 후에.

해결책: 이 가져오기를 해당 모듈 가져오기 위로 이동합니다.

언급URL : https://stackoverflow.com/questions/43549223/typeerror-you-provided-an-invalid-object-where-a-stream-was-expected-you-can-p

반응형