您在预期流的位置提供了“未定义”

Posted

技术标签:

【中文标题】您在预期流的位置提供了“未定义”【英文标题】:You provided 'undefined' where a stream was expected 【发布时间】:2020-03-10 15:33:31 【问题描述】:

我在我的控制台中得到了这个。因为它没有指向我的代码,所以我不知道它是怎么回事:

TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
at subscribeTo (subscribeTo.js:28)
at subscribeToResult (subscribeToResult.js:15)
at CatchSubscriber.push../node_modules/rxjs/_esm5/internal/operators/catchError.js.CatchSubscriber.error (catchError.js:43)
at CatchSubscriber.push../node_modules/rxjs/_esm5/internal/OuterSubscriber.js.OuterSubscriber.notifyError (OuterSubscriber.js:13)
at InnerSubscriber.push../node_modules/rxjs/_esm5/internal/InnerSubscriber.js.InnerSubscriber._error (InnerSubscriber.js:18)
at InnerSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.error (Subscriber.js:59)
at Observable._subscribe (throwError.js:5)
at Observable.push../node_modules/rxjs/_esm5/internal/Observable.js.Observable._trySubscribe (Observable.js:43)
at Observable.push../node_modules/rxjs/_esm5/internal/Observable.js.Observable.subscribe (Observable.js:29)
at subscribeToResult (subscribeToResult.js:13)

有人可以帮忙吗?

更新。这是实际的调用:

this.http.get(`$environment.apiUrl/api/home/`)
   .subscribe((data: any) => console.log(data);
);

更新 2。 这是我的拦截器最有可能发生的地方:

 intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> 
  // add authorization header with jwt token if available
  request = this.addTokenToRequest(request);
  return next.handle(request);
  // .pipe(
  //   catchError((error: HttpErrorResponse) => 
  //     if (error instanceof HttpErrorResponse) 
  //       switch (error.status) 
  //         case 406: 
  //           return this.handle406Error(request, next);
  //         
  //         // case 'Unauthorized': 
  //         //   // return this.handle401Error(request, next);
  //         // 
  //     
  //   ));

所以,如果我注释掉 .pipe 我不会收到消息。但如果有错误,我仍然想处理。

更新 3。 这是最初的电话:

ngOnInit(): void     
    this.http.get(`$environment.apiUrl/api/web/home/`)
      .subscribe((data: any) => 
        console.log(data);
    );

【问题讨论】:

它告诉你你调用了 .subscribe() 的东西不是 Observable 我用实际通话更新了我的问题。 我知道它发生在哪里,但仍然不知道为什么。我也有一个拦截器。我已将其代码添加到我的问题中。如果我不这样做 .pipe 我不会收到消息。 你确定它在提供的代码行上吗?能否提供服务功能,如何调用? @Chund。不,没有帮助。 【参考方案1】:

在我的例子中,这个错误是由“循环引用”引起的。所以基本上,这个错误与 rxjs 没有任何关系。至少不是直接的,是 json 序列化出错了,所以这个错误实际上非常具有误导性。

我基本上拥有的是 2 个对象:

class Person 
    id: number;
    pets: Pet[];


class Pet 
    id: number;
    owner: Person;

当我检索到具有 Pets 列表的 Persons 列表时,我想将所有 pet.owner 与其父 Person 相关联,因为在从服务器检索后这些通过引用将不同。所以我有这个代码:

persons.forEach(person => person.pets.forEach(pet => pet.owner = person));

现在我有对象的循环引用:person1 有 pet1 链接到所有者 person1 有 pet1 链接到...等...

当 person1 试图序列化为 json 时,json 显然不知道在哪里停止并且可能返回一个未定义的。这个 undefined 被传递给 rxjs,它需要一个流、可观察的等,这会导致错误。

因此,如果您曾经遇到此错误,并且您检查了所有建议的选项,但没有一个建议有效,请检查您在 rxjs 操作中使用的对象。在我的情况下,它是 HttpClient.post,我将我想要发布到服务器的对象发送到该处。

【讨论】:

以上是关于您在预期流的位置提供了“未定义”的主要内容,如果未能解决你的问题,请参考以下文章

Angular 4 - Http 请求错误:您在预期流的位置提供了“未定义”

Angular5:TypeError:您在预期流的位置提供了“未定义”。您可以提供 Observable、Promise、Array 或 Iterable

无效属性:预期的数组,但未定义

地理位置未捕获类型错误:无法读取未定义的属性“坐标”

使用带文件的fseek(文件,0,SEEK_END)了解二进制流的未定义行为

所需类型“ID!”的变量“$charactersID”未提供。,位置:[object Object],路径:未定义