Получение ошибки «this.appInits [i] не является функцией» при добавлении APP_INITIALIZER в мое приложение angular - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь реализовать https://www.npmjs.com/package/keycloak-angular на своем сайте, чтобы мое внешнее приложение angular могло аутентифицировать пользователя с помощью Keycloak.

После ввода кода , Я все время получаю сообщение об ошибке:

ERROR TypeError: this.appInits[i] is not a function
    at ApplicationInitStatus.runInitializers (core.es5.js?de3d:2807)
    at eval (core.es5.js?de3d:4506)

Кто-нибудь знает, почему это может происходить? Я использую Angular 4.3.2 и keycloak- angular 7.2.0 и keycloak- js 8.0.2.

Вот большая часть моего app.module.ts:

import {NgModule, APP_INITIALIZER} from '@angular/core';
import { KeycloakService, KeycloakAngularModule } from 'keycloak-angular';
import { initializer } from './utils/app-init';
...

@NgModule({
    imports: [
        ...
        KeycloakAngularModule
    ],
    declarations: [
        ...
    ],
    providers: [
        ...
        {
            provide: APP_INITIALIZER,
            useFactory: initializer,
            multi: true,
            deps: [KeycloakService],

            useClass: OdpToastOptions
        }
    ],
    bootstrap: [JhiMainComponent]
})

export class UiAppModule {}

Вот мой app-init.ts:

export function initializer(keycloak: KeycloakService): () => Promise<any> {

    keycloak.init({
        config: {
            url: 'https://keycloak.mydomain.com/auth',
            realm: 'myrealm',
            clientId: 'myclient',
        },
        initOptions: {
            onLoad: 'login-required',
            checkLoginIframe: false,
        },
        enableBearerInterceptor: true,
        bearerExcludedUrls: ['/assets', '/clients/public'],
    });

    return (): Promise<any> => keycloak.init();
}

1 Ответ

1 голос
/ 21 июня 2020

У провайдера не может быть одновременно useFactory и useClass. Я предполагаю, что useClass: OdpToastOptions следует удалить у этого провайдера:

{
    provide: APP_INITIALIZER,
    useFactory: initializer,
    multi: true,
    deps: [KeycloakService],

    useClass: OdpToastOptions // <-- REMOVE LINE
}

Это может исправить:

{
    provide: APP_INITIALIZER,
    useFactory: initializer,
    multi: true,
    deps: [KeycloakService],
}
...