吞没的消息:错误:未捕获(承诺):[对象未定义]

2024-04-10

我的登录组件会短暂显示,然后被有关承诺中未定义对象的错误消息删除。

这是承诺的定义:

  static init(): Promise<any> {
    KeycloakClientService.auth.loggedIn = false;
    return new Promise((resolve, reject) => {
      const keycloakConfig = {
      url: environment.KEYCLOAK_URL,
      realm: environment.KEYCLOAK_REALM,
      clientId: environment.KEYCLOAK_CLIENTID,
      'ssl-required': 'external',
      'public-client': true
      };
      const keycloakAuth: any = new Keycloak(keycloakConfig);

      keycloakAuth.init({onLoad: 'check-sso'})
        .success(() => {
          KeycloakClientService.auth.loggedIn = true;
          KeycloakClientService.auth.authz = keycloakAuth;
          KeycloakClientService.auth.logoutUrl = environment.KEYCLOAK_URL
          + '/realms/' + environment.KEYCLOAK_REALM + '/protocol/openid-connect/logout?redirect_uri='
          + document.baseURI;
          console.log('=======>> The keycloak client has been initiated successfully');
          resolve('Succeeded in initiating the keycloak client');
        })
        .error(() => {
          reject('Failed to initiate the keycloak client');
        });
    });
  }

它被称为:

KeycloakClientService.init()
  .then(
    () => {
      console.log('The keycloak client has been initialized');
    }
  )
  .catch(
    (error) => {
      console.log(error);
      window.location.reload();
    }
  );

控制台显示两条消息:

The keycloak client has been initiated successfully
The keycloak client has been initialized

我正在使用角度6.0.4并尝试遵循这个blog https://medium.com/@blained3/connecting-keycloak-to-angular-d175c92a0dd3

有什么方法可以解决此错误,以便保持我的登录表单显示?

更新:我尝试使用可观察的而不是承诺,但问题仍然相同:

  public init(): Observable<any> {
    KeycloakClientService.auth.loggedIn = false;
    return new Observable((observer) => {
      const keycloakConfig = {
        'url': environment.KEYCLOAK_URL,
        'realm': environment.KEYCLOAK_REALM,
        'clientId': environment.KEYCLOAK_CLIENTID,
        'ssl-required': 'external',
        'public-client': true
      };
      const keycloakAuth: any = new Keycloak(keycloakConfig);

      keycloakAuth.init({ 'onLoad': 'check-sso' })
        .success(() => {
          KeycloakClientService.auth.loggedIn = true;
          KeycloakClientService.auth.authz = keycloakAuth;
          KeycloakClientService.auth.logoutUrl = environment.KEYCLOAK_URL
            + '/realms/' + environment.KEYCLOAK_REALM + '/protocol/openid-connect/logout?redirect_uri='
            + document.baseURI;
          console.log('The keycloak auth has been initialized');
          observer.next('Succeeded in initiating the keycloak client');
          observer.complete();
        })
        .error(() => {
          console.log('The keycloak client could not be initiated');
          observer.error('Failed to initiate the keycloak client');
        });
    });
  }

完整的源代码可以在GitHub https://github.com/stephaneeybert/ng-hero

更新:根据下面的答案,我还尝试使用then() and a catch()关键字但错误仍然完全相同:

keycloakAuth.init({ 'onLoad': 'check-sso' })
        .then(() => {
          KeycloakClientService.auth.loggedIn = true;
          KeycloakClientService.auth.authz = keycloakAuth;
          KeycloakClientService.auth.logoutUrl = environment.KEYCLOAK_URL
            + '/realms/' + environment.KEYCLOAK_REALM + '/protocol/openid-connect/logout?redirect_uri='
            + document.baseURI;
          console.log('The keycloak auth has been initialized');
          observer.next('Succeeded in initiating the keycloak client');
          observer.complete();
        })
        .catch(() => {
          console.log('The keycloak client could not be initiated');
          observer.error('Failed to initiate the keycloak client');
        });

这是一个疯狂的猜测,但也许它与 Angular 的区域发生冲突。由于这是一个安全库,它可能不喜欢 Angular 用代理替换核心功能。例如,NgZone修改window.setTimeout和 HTTP 方法。

因此,您可以尝试在区域之外运行此代码。这里唯一的问题是你正在使用static函数,并且必须使其成为可注入服务,以便您可以访问NgZone

@Injectable()
export class KeycloakClientService {
    public constructor(private zone: NgZone) {
    }

    public init(): Promise<any> {
        KeycloakClientService.auth.loggedIn = false;
        return new Promise((resolve, reject) => {
            this.zone.runOutsideAngular(() => {
                const keycloakConfig = {
                     url: environment.KEYCLOAK_URL,
                     realm: environment.KEYCLOAK_REALM,
                     clientId: environment.KEYCLOAK_CLIENTID,
                     'ssl-required': 'external',
                     'public-client': true
                };

                const keycloakAuth: any = new Keycloak(keycloakConfig);

                keycloakAuth.init({onLoad: 'check-sso'})
                    .success(() => {
                        KeycloakClientService.auth.loggedIn = true;
                        KeycloakClientService.auth.authz = keycloakAuth;
                        KeycloakClientService.auth.logoutUrl = environment.KEYCLOAK_URL
                            + '/realms/' + environment.KEYCLOAK_REALM + '/protocol/openid-connect/logout?redirect_uri='
                            + document.baseURI;
                        console.log('=======>> The keycloak client has been initiated successfully');
                        resolve('Succeeded in initiating the keycloak client');
                    })
                    .error(() => {
                        reject('Failed to initiate the keycloak client');
                    });
            });
        }
    }
}

这里的改变是使用zone.runOutsideAngular

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

吞没的消息:错误:未捕获(承诺):[对象未定义] 的相关文章

  • 您可以将现有的 div 复制到模式对话框吗

    我有一个带有多个面板的仪表板来显示不同的信息 我希望能够添加一个按钮来以模式显示面板 我正在使用引导程序 我所能找到的只是已经编写的模态 我想复制作为面板的 div 标签的内容 然后将其显示在模型中 但我不确定如何进行 该面板的 html
  • Sequelize - 使用 es6 和模块运行迁移

    我不确定我是否做错了什么或者什么 我觉得我正在运行一个现代的 相当常见的堆栈 但我无法让新的 Sequelize v6 与我的设置完美配合 我在 Node v14 17 Sequelize v6 6 2 上 在我的 package json
  • Angularjs 完整日历不显示事件

    我正在用那个https github com angular ui ui calendar https github com angular ui ui calendar在 Angularjs 中使用 FullCalendar 它显示日历并
  • 递归修剪对象中所有元素的更好方法?

    如果我有一个像这样的物体 const obj field subfield innerObj a asdasd asdas innerArr s ssad innerArrObj b adsad 我想出了这样的东西 const trimFi
  • 在 setInterval / setTimeout 中使用变量作为时间[重复]

    这个问题在这里已经有答案了 这是一个示例情况 var count time 1000 setInterval function count 1 time 上面的代码会将 count 变量加 1 即 1000 毫秒 看来 setInterva
  • 如何在php中使用一张图像绘制形状

    我需要使用图像的一部分来创建帧图像 例如 用户将从后端上传图像片段 现在我需要根据前端用户的要求在前端创建一个框架 用户将选择框架的高度和宽度 然后他将选择该图像片段 如下所示 我没有办法做到这一点 我尝试通过 css 和 html can
  • 如何使用 jQuery Ajax 将 PHP 数组值传递到另一个文件?

    这是我的代码
  • html canvas动画卡顿

    谁能解释为什么提供的画布动画断断续续 我创建了一个测试存根来演示该问题 我在桌面上的 FF Chrome IE 以及 Android 上的 FF 和 Chrome 中看到了卡顿现象 口吃是由于垃圾收集造成的吗 似乎 raf 在每次调用时都会
  • 为什么我们使用 SpreadsheetApp.flush()?

    我的理解是 flush https developers google com apps script reference spreadsheet spreadsheet app flush有助于在功能发生时执行这些功能 而无需将它们捆绑在
  • 如何循环遍历对象数组并生成键值对?

    我有一个像这样的对象数组 let someObj items id 12 value true id 34 value true id 56 value false 我想将其添加到现有对象中 其中 id 是该对象的键 如下所示 let ob
  • “|”是什么意思(单管道)在 JavaScript 中做什么?

    console log 0 5 0 0 console log 1 0 1 console log 1 0 1 为什么0 5 0返回零 但任何整数 包括负数 都返回输入整数 单管道 有什么作用 这是一个按位或 https developer
  • ReactCSSTransitionGroup 组件WillLeave 未调用

    我尝试使用 ReactCssTransition 但不知何故该事件没有被调用 componentWillLeave 这是我的组件 import React Component from react import TransitionGrou
  • 如何知道浏览器空闲时间?

    如何跟踪浏览器空闲时间 我用的是IE8 我没有使用任何会话管理 也不想在服务器端处理它 这是纯 JavaScript 方法来跟踪空闲时间 并在达到一定限制时执行一些操作 var IDLE TIMEOUT 60 seconds var idl
  • 有没有办法伪造同步 XHR 请求?

    我正在使用 Emscripten 系统将一堆 C 代码移植到 Javascript C 代码有很多调用fopen这是一个同步 IO 调用 在 Emscripten 中 我们使用对本地资源的 XHR 请求来模拟这一点however 在 Fir
  • jQuery 悬停时滚动到 div 并返回到第一个元素

    我基本上有一个具有设定尺寸的 div 和overflow hidden 该 div 包含 7 个子 div 但一次只显示一个 我希望当它们各自的链接悬停时能够平滑地垂直滚动 但是 第一部分 div 没有链接 并且是没有悬停链接时的默认部分
  • 在 *ngFor 循环内使用 Angular i18n 和 Angular 5

    我想在模板中的 ngFor Loop 内使用动态翻译 如下所示
  • 根据特定字符获取整个字符串或子字符串

    我有一个包含 MIME 类型的字符串 例如application json 现在我想将其与实际的 HTTP 标头进行比较 在本例中content type 如果标头包含 MIME 类型 那么就很简单 if mimeType contentT
  • 不使用控件时,视频元素在 Chrome 中消失

    So I think这是一个浏览器错误 它出现在一个更复杂的设计 网站中 但我已经进行了很好的尝试 简化了我的代码和设计等 并发现了以下内容 嵌入时
  • 检测浏览器选项卡是否具有焦点

    是否有可靠的跨浏览器方法来检测选项卡是否具有焦点 场景是 我们有一个定期轮询股票价格的应用程序 如果页面没有焦点 我们可以停止轮询并为每个人节省流量噪音 特别是当人们喜欢打开具有不同投资组合的多个选项卡时 Is window onblur
  • 在具有多级分组的 HTML 表格中显示数据

    我必须通过使用 rowspan 进行分组来显示 HTML 表中的一些数据 下面是预期的 GUI 我有如下所示的 JSON 数据 JSON数据here https jsoneditoronline org id 1014438e5489485

随机推荐

  • 如何找到距离原点最近的坐标?

    我知道有很多关于按多个值对 javascript 数组进行排序的问题 但没有一个答案解决了我的问题 我有一个坐标数组 例如 x y 10 20 12 18 20 30 5 40 100 2 如何获取距离原点最近的坐标 使用以下方法计算每个点
  • 快速多重替换为字符串

    我有一个如下所示的字符串 A jahshs b jwuw c wuqjwhaha d e f jsj g 我需要更换每一个 x 用不同的字符串 问题来了 因为这个过程将重复大约 1000 次 秒 所以我需要一种优化 快速的方法来完成它 任何
  • 如何优化 HTML 表格中的多个重复图像

    我正在生成一个大型 HTML 表格 并且对许多单元格使用图像 例如 一列可能具有拇指向上的图像或拇指朝下的图像 如果我有 300 行 其中 200 行竖起大拇指 那么它们都有 a href link img src http myserve
  • .NET 中小数、浮点和双精度之间的区别?

    有什么区别decimal float and double在 NET 中 什么时候有人会使用其中之一 float C 别名为System Single and double C 别名为System Double are 漂浮的binary点
  • List.add 和手动添加项目到 Riverpod StateNotifier> 之间的区别

    我想学习如何使用Riverpod https riverpod dev 因此为此我正在实现一个小应用程序 该应用程序显示项目列表和一个按钮 该按钮在点击时将虚拟项目添加到列表中 问题背景 按下以下应用程序中的按钮将按预期工作 添加一个虚拟项
  • MKMapView居中并放大

    我在一个项目中使用 MKMapView 希望将地图置于坐标中心并放大 就像 Google 地图一样 GMSCameraPosition camera withLatitude 33 8683 longitude 151 2086 zoom
  • 使用 bootstrap css 打印

    我有一个带有 bootstrap css 布局的页面 我正在尝试打印表格 然而 该表看起来与屏幕上的完全不同 我包含这样的 css 文件 有没有办法让打印的表格看起来与屏幕上的一样 或者我是否必须为我想要打印的表格创建一个特定的 css 文
  • 当 access_type=online 时,“此应用程序希望:具有离线访问权限”

    我有一个带有 OAuth 2 0 身份验证的 Google 应用程序 一切过去都工作正常 但最近我开始收到以下 请求许可 屏幕 奇怪的是 当我经过时 我看到这个屏幕access type online 同样 这种方法直到最近才有效 造成这种
  • 在 Scala 3 中派生不透明类型的类型类实例

    Scala 3 有没有办法使用derives关键字与不透明类型别名结合使用 最好有一种无样板的方法 通过自动依赖基础类型 如果有 的相同类型类的实例来为给定的不透明类型别名提供类型类实例 如果能够表达类似的东西就好了 opaque type
  • 将逗号分隔的字符串解析为某种可以循环访问各个值的对象的最简单方法?

    将逗号分隔的字符串值列表解析为可以循环的某种对象的最简单方法是什么 以便我可以轻松访问各个值 示例字符串 0 10 20 30 100 200 我对 C 有点陌生 所以请原谅我问这样一个简单的问题 谢谢 这有一些问题 但最终最简单的方法是使
  • 子类如何访问父类的属性?

    我有一个关于 Javascript 对象的问题 如何访问父类的属性 function randomObj for example button obj this text this is obj function parentClass t
  • dreamhost 上的 SSH 密钥

    我正在尝试设置与 dreamhost 和我的本地计算机配对的 SSH 密钥 我使用 git bash 作为我的终端 使用 mingw32 我可以通过 ssh 电子邮件受保护 cdn cgi l email protection并要求我提供密
  • rspec,未知属性问题

    我正在 优秀的 railstutorial org 网站上工作 有一个关于 rspec 的基本问题 当我在新用户模型上运行以下测试时 我收到 未知属性 用户名 消息和失败的测试 before each do attr lname e gt
  • 从 IE EPM BHO 内访问命名管道服务器

    我正在尝试对我们的旧产品进行一些更改 以支持 BHO 上的 IE EPM 我已经设法加载它并调用各种方法 SetSite DocumentComplete 等 当我尝试连接到 Windows 服务中运行的命名管道服务器时 我似乎遇到了障碍
  • 如何在 Clojure 中遍历一棵树,同时收集每个节点节点的值?

    我想创建一个函数来收集二叉树中每个节点的值 在 ClojureDocs 中 我发现了几个用于遍历树 图的函数 例如 tree seq prewalk 和 postwalk https clojuredocs org clojure core
  • 为什么在 MySQL 中使用 CAST 时出现语法错误?

    我正在使用 MySQL Workbench v5 2 44 CE 我正在针对本地 MySQL 5 5 安装运行它 我正在尝试使用CAST函数 但不断出现以下错误 语法错误 意外的 INT SYM 源日期和目标日期类型是什么并不重要 唯一不给
  • Google oauth2 与 devise 和omniauth 处理为失败

    我正在尝试配置一个新的rails4 2应用程序来针对Google Oauth2进行身份验证 我似乎成功地完成了这个过程 但它被视为失败 最初的授权似乎进展顺利 直到谷歌发送回调 那么似乎就被错误地认定为失败了 给出的错误信息是 Could
  • 查找信标的两个地理位置之间的点

    假设我们有两个beacons放置在道路两侧 我们知道他们的latitude and longitude它们所在的位置 我们将它们视为一个位置 我们还知道distance两者之间以米为单位beacons 使用半正矢公式测量 我们的设备正在这两
  • 如何修复警告:视图不在窗口层次结构中

    我正在使用标准设置程序Mobclix in an iOS应用程序 我正在调用requestAndDisplayAdFromViewController 从内部开始的方法viewWillAppear void viewWillAppear B
  • 吞没的消息:错误:未捕获(承诺):[对象未定义]

    我的登录组件会短暂显示 然后被有关承诺中未定义对象的错误消息删除 这是承诺的定义 static init Promise