您在预期流的位置提供了“未定义”
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