【发布时间】: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