当前位置: 首页 > 知识库问答 >
问题:

效果"AuthEffects.authLogin$"发送了一个无效的操作:未定义

乐正远
2023-03-14

在Angular 6(和RxJS)应用程序中,我有一个管理登录的效果。它首先调用服务器,然后设置并解码令牌。最后,我添加了处理重定向的最后一个操作。

情况是这样的:用户(未登录)尝试访问个人资料页面。在AuthGuard中,我拦截它,并保存所需的页面(auth-guard.service.ts):

 .. Here I already know that the user is not authenticated.
let url = state.url;
  if (url) {
       .. I save in the Store the url
       this.store.dispatch(new CoreActions.SaveRedirectUrl(url));
 }
 this.router.navigate(['/login']);
 return false;

这是Auth效果的最后两部分(Auth.effects.ts,在我发送操作DO\u登录时调用):

, mergeMap((tokenObj: any) => {
    return [
        {
            type: AuthActions.LOGIN 
        },
        {
            type: AuthActions.SET_TOKEN,
            payload: tokenObj.token
        },
        {
            type: ProfileActions.DECODE_TOKEN,
            payload: tokenObj.token
        }
    ];
})
, exhaustMap(() => {
    return this.store.select('core')
        .pipe(
            map(coreState => {
                if (coreState.redirectUrl) {
                    this.router.navigate([coreState.redirectUrl]);
                } else {
                    this.router.navigate(['/']);
                }
                new CoreActions.RemoveRedirectUrl();
            }));
}),

因此,我正在研究这种行为:在用户登录后,我保存令牌,我(最终)重定向到所需页面,然后从状态中删除该页面。我确信第一个mergeMap()可以工作。。当我添加最后一个部件(排气图)时,所有部件都损坏了,我无法找到控制台错误的解决方案:

ERROR错误:效果"AuthEffects.authLogin$"发送了一个无效的操作:未定义

如果我更改最后一次“返回”的位置:

this.store.select('core') -----> from here
    .pipe(
        map(coreState => {
            if (coreState.redirectUrl) {
                this.router.navigate([coreState.redirectUrl]);
            } else {
                this.router.navigate(['/']);
            }
            return new CoreActions.RemoveRedirectUrl(); -----> to here
        }));

我有一个编译错误在用尽地图():

类型为“(”的参数=

共有1个答案

佟云
2023-03-14

使用Angular 6和rxjs 6.0。0

我最近在管理我的ngrx登录时遇到了类似的问题,并且遵循了与您上面描述的类似的模式。在我的$login效果中,我最初有:

@Effect()
  login$ = this.actions$.pipe(
    ofType<Login>(AuthActionTypes.Login),
    map(action => action.payload),
    exhaustMap((auth: Authenticate) =>
      this.authService.loginWithUsernameAndPassword(auth).pipe(
        map(user => {
          if (user && user.token) {
            this.cookieService.set('token', user.token)
          }
          new LoginSuccess({user})
          return user;
        }),
        catchError(error => of(new LoginFailure(error)))
      )
    )
  );

我返回了用户,这给了我一个错误,所以我放弃了它,只是尝试创建新的登录成功({user})。不过,这也给了我一个类似于您上面描述的错误的错误。我认为pipe()中的map()函数不需要副作用。我只是通过使用tap()。一旦我这样做了,一切都按预期进行——没有错误或异常。

@Effect()
  login$ = this.actions$.pipe(
    ofType<Login>(AuthActionTypes.Login),
    map(action => action.payload),
    exhaustMap((auth: Authenticate) =>
      this.authService.loginWithUsernameAndPassword(auth).pipe(
        // user tap to set my cookie and achieve my side effect
        tap(user => {
          if (user && user.token) {
            this.cookieService.set('token', user.token)
          }
        }),
        // use map without any side effect
        map(user => new LoginSuccess({ user })),
        catchError(error => of(new LoginFailure(error)))
      )
    )
  );

 类似资料:
  • 我正在尝试为我的登录构建一个提交表单,但我不知道为什么这个操作不起作用。有什么想法吗? > 列表项jquery $(“Form”).Submit(函数(e){e.PreventDefault();switch(this.id){case“login-form”:var$lg_username=$('#login_username').val();var$lg_password=$('#login_

  • 问题内容: 我正在尝试连接到本地oracle数据库,但是却收到此错误消息: 。 我很确定这是由于我传递的数据库连接参数出错,但实际上,此错误消息对我没有任何帮助。关于我做错了什么的任何提示将不胜感激。 仅供参考:用于连接的代码如下,除了硬编码的字符串,这是在我们的生产环境中使用并在此处工作的代码。 问题答案: 令人惊讶的是,在将以下两行添加到创建连接的代码中之后,它开始工作了。 我不明白为什么我们

  • 如果第一个作业的爆发时间是最高的,FCFS可能会受到队列影响。 就像在现实生活中一样,如果队列在路上经过,那么其他人可能会被堵塞,直到完全通过。 这也可以在操作系统中进行模拟。 如果CPU在就绪队列的前端获得较高突发时间的进程,则较低突发时间的进程可能被阻塞,这意味着如果执行中的作业具有非常高的突发时间,则它们可能永远不会获得CPU。 这被称为队列效应或饥饿。 示例 在这个例子中,我们有个进程被命

  • 我正在使用PHPMailer通过联系人表单发送电子邮件。当我在输入字段中输入无效的电子邮件地址时,电子邮件仍会发送。我想同时执行客户端和服务器端验证。 PHPMailer是否有一个内置的验证系统来检查无效的电子邮件地址?如果输入的电子邮件无效,我想返回一个错误,而不是发送电子邮件。

  • 我刚刚开始学习现代OpenGL,我在渲染三角形时遇到了麻烦。当我启动程序时,当我尝试调用时,它会给出一个无效操作异常。从控制台日志的外观来看,着色器的设置没有错误,程序也经过了验证。很多代码都是从本教程中复制的。我已经搜索了几个小时,无法找出导致问题的原因。如果我错过了一些基本的东西,我真的很抱歉。 java程序: 顶点着色器: 和片段着色器:

  • 真的很奇怪,为什么在将挂起状态更改为之后,第一个操作的位置没有改变。 打印输出: 预期打印输出: UPD只注意到的这种行为。对于具有的自定义按预期工作。