Keycloak Roles: Uncaught TypeError: Cannot read properties of undefined (reading 'roles') - React

Keycloak Roles: Uncaught TypeError: Cannot read properties of undefined (reading 'roles') - React

我有以下代码:

class Secured extends Component {

import React, { Component } from 'react';
import Keycloak from 'keycloak-js';

constructor(props) {
    super(props);
    this.state = { keycloak: null, authenticated: false, roles: [] };
}

componentDidMount() {
    const keycloak = Keycloak('/keycloak.json');
    keycloak.init({onLoad: 'login-required'}).then(authenticated => {
        this.setState({ keycloak: keycloak, authenticated: authenticated, roles: keycloak.tokenParsed.realm_access.roles})
    })
}

render() {
    if(this.state.keycloak) {
      if(this.state.authenticated)
      { if(this.state.roles.includes("prototype-user")){
        return ( //the rest of the code here

keycloak.tokenParsed.realm_access.roles 没有值时,我总是会收到错误 Uncaught TypeError: Cannot read properties of undefined (reading 'roles')。如果它有值,则不会出现错误。

我上周才开始 React.js,对 JavaScript/TypeScript 不是很熟悉,所以我发现很难实施我发现的相同问题的解决方案。

导致错误的原因是什么,我将如何解决?

为了防止您的代码在 keycloak.tokenParsed.realm_access 未定义时失败,您需要使用 javascript 的一项功能,称为可选链接。

这是它的工作原理。

假设您正在尝试访问对象 属性(或调用对象 属性),但您不确定该对象是否始终具有 属性例如,您可以看到下面的代码没有 realm_access 作为嵌套 tokenParsed 对象的 属性,当我们尝试访问它时它失败了。

const user = { 
  keycloak: null, 
  authenticated: false,
  tokenParsed: {
    token: '1245'
  }
}

const roles = user.tokenParsed.realm_access.roles //This would throw a TypeError

但是假设您想在 属性 不存在时防止此错误,这就是可选链接的用武之地

const roles = user?.tokenParsed?.realm_access?.roles

通过在 属性 名称和下一个 属性 之前的句号之间插入一个 ?,它只会 return undefined 而不是抛出丑陋的错误