【问题标题】:Angular 8: ERROR Error: Uncaught (in promise): TypeError: You provided an invalid object where a stream was expectedAngular 8:错误错误:未捕获(承诺中):TypeError:您提供了一个无效的对象,其中预期有流
【发布时间】:2020-05-09 03:00:33
【问题描述】:

我有一个最近升级的 Angular 应用程序(Angular v7 => v8),以前一切正常。

但是现在,切换到 8 后,我的登录功能出现错误(如下)。该错误很可能很容易解决,但堆栈跟踪几乎没有意义。它不显示类型错误实际发生的位置,供应商代码除外。

我试图在黑暗中尝试修复它,例如解决从 this.router.navigate 返回的承诺,将订阅变成承诺,将 console.log 添加到 auth 保护以查看它是否停止(它没有)最后,我在我的屏幕(登录后的屏幕)中添加了一些日志记录代码,但没有任何记录。

有人遇到过这种情况吗?我查看了升级说明,没有发现任何突出之处。如果有人有任何提示可以找出发生这种情况的地方,我可以从那里得到它。

登录代码:

    this.clearAlerts();
    localStorage.setItem('persistLogin', this.persistLogin.toString());
    this.svc
      .login(this.user).subscribe((res: ApiResponse) => {
        console.log(res);
        this.router.navigate([res.action.href]);
      }, err => {
          console.log(err);
        this.error = err.error.message;
        if (err.error.action) {
          this.links.resolve(err.error);
        }
      }, () => console.log('done'));
  }

错误信息

完成后发生。

    core.js:6014 ERROR Error: Uncaught (in promise): TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
    TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
        at subscribeTo (subscribeTo.js:27)
        at from (from.js:9)
        at Observable._subscribe (defer.js:14)
        at Observable._trySubscribe (Observable.js:42)
        at Observable.subscribe (Observable.js:28)
        at TakeOperator.call (take.js:22)
        at Observable.subscribe (Observable.js:23)
        at subscribeToResult (subscribeToResult.js:9)
        at MergeMapSubscriber._innerSub (mergeMap.js:59)
        at MergeMapSubscriber._tryNext (mergeMap.js:53)
        at resolvePromise (zone-evergreen.js:793)
        at resolvePromise (zone-evergreen.js:752)
        at zone-evergreen.js:854
        at ZoneDelegate.invokeTask (zone-evergreen.js:400)
        at Object.onInvokeTask (core.js:39680)
        at ZoneDelegate.invokeTask (zone-evergreen.js:399)
        at Zone.runTask (zone-evergreen.js:168)
        at drainMicroTaskQueue (zone-evergreen.js:570)
        at ZoneTask.invokeTask [as invoke] (zone-evergreen.js:485)
        at invokeTask (zone-evergreen.js:1596)

编辑 - 添加了登录服务代码。

登录 Svc 代码 - 注意,我尝试删除它并得到相同的错误

login(user: User) {
    return this.http.post(`${environment.api}/account/login`, user).pipe(
      map((res: ApiResponse) => {
        localStorage.setItem('token', res.payload);
        return res;
      }),
      map(
        (res: ApiResponse) => {
          const timer$ = timer(0, REFRESH_INTERVAL);
          this.$isAuthenticated = timer$.pipe(
            switchMap(_ => this.getIsAuthenticated()),
            shareReplay(CACHE_SIZE)
          );
          return res;
        },
        map((res: ApiResponse) => {
          const timer$ = timer(0, REFRESH_INTERVAL);
          this.$user = timer$.pipe(
            switchMap(_ => this.getSelf()),
            shareReplay(CACHE_SIZE)
          );
          return res;
        })
    )
    );
  }

EDIT 2 添加 Home 组件

主页组件代码(M

import { Component, OnInit } from '@angular/core';
import { select, Store } from '@ngrx/store';
import { Subscription } from 'rxjs';
import { User } from '../../models/user.model';
import { AppService } from '../../services/app.service';
import { IState } from '../../store/reducers';
import { selectApp } from '../../store/selectors/app.selectors';
import { IAppState } from './../../store/state/app.state';

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.scss']
})
export class HomeComponent implements OnInit {
  homeContent = [];
  user: User;
  contentSub: Subscription;
  sub: Subscription;
  appState$ = this._store.pipe(select(selectApp));
  state: IAppState;
  constructor(private svc: AppService, private _store: Store<IState>) {}

  ngOnInit() {
    console.log('123');
    this.contentSub = this.svc
      .getHomeContent()
      .subscribe(res => {
        console.log(123451232);
        this.homeContent = res.payload.items;
      });
    this.appState$.subscribe(value => {
      console.log(12345);
      this.user = value.user;
    });
  }
}

选择器代码:

import { createSelector } from '@ngrx/store';
import { IState } from '../reducers';
import { IAppState } from '../state/app.state';

const appState = (state: IState) => state.app;

export const selectApp = createSelector(
  appState,
  (state: IAppState) => state.app
);

环境:

Angular CLI: 8.3.20
Node: 10.18.0
OS: win32 x64
Angular: 8.2.14

【问题讨论】:

  • 从控制台错误来看,subscribeTo.js 第 27 行似乎有错误。您可以将 subscribeTo.js sn-p 连同 .login 服务的实现一起发布吗?
  • 当然可以。我最初没有发布它的原因是因为我在订阅代码中添加了 console.logs 并且它正在通过 console.logs 并进入导航到下一页的块
  • 那么,你能把res.action.href 导致的组件的js代码贴出来吗?
  • 已添加。我猜嫌疑人可能是 NgRx 商店代码
  • 抱歉,在这种情况下帮不上忙。在我看来更像是内部代码失败了,只能通过调试整个应用程序来寻找。

标签: angular typescript rxjs


【解决方案1】:

当我发现我有一个循环依赖时,我终于解决了这个问题。

我运行了ng build --aot,它在我的app.module.ts 文件中引发了关于循环依赖的警告。

在文件的底部,我注意到我有:

platformBrowserDynamic().bootstrapModule(AppModule);。本质上是引用自身。我做了一些快速的谷歌搜索,发现该行属于main.ts

移动线路,问题就消失了。

【讨论】:

  • 谢谢泰勒!这并没有解决我的问题。我的 app.module.ts 和 main.ts 已经正确了。但是,这个话题解决了我的问题:stackoverflow.com/questions/54095476/…
  • @BobC 尝试进行 aot 构建。这似乎暴露了更多的错误和提示
猜你喜欢
  • 2017-11-11
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多