Угловой 6: Uncaught (в обещании): Ошибка: StaticInjectorError (AppModule) [RoleGuardService] - PullRequest
1 голос
/ 15 марта 2019

Я хочу использовать сервис RoleGuard в одном из моих проектов Angular 6.Я создал файл - 'role-guard.service.ts' в папке "_guards".Теперь в файле маршрутов я объявил то же, что и ниже, и попробую реализовать то же самое.Обратите внимание, у меня есть общий модуль, и я не объявлял roleguardservice в экспорте.

import { RoleGuardService } from '../../_guards/role-guard.service';
const routes: Routes = [
    { path: 'edit-account-info', component: EditAccountInfoComponent, canActivate: [RoleGuardService] },
    ....
    ....
    ]
}

Ниже мой app.module.ts file:

import { AuthGuard, DisableAuthGuard} from '../../_guards/auth.guard';
....
....
exports : [
    // 
  ],
  providers: [AuthGuard, DisableAuthGuard, {
    provide: RECAPTCHA_SETTINGS,
    useValue: {
      siteKey: environment.recaptchasiteKey,
    } as RecaptchaSettings,
  }]

Я хочу изменить маршрутызависит от роли пользователя.Например, если пользовательская роль типа 1, он будет перенаправлен на «edit-account-info», в противном случае (если пользовательская роль типа 2) он перенаправит на «agent / edit-account-info».Если пользовательская роль типа 2 хочет получить доступ к пути «edit-account-info», он перейдет на страницу «unauthorize».

Но для ее реализации, когда я захочу получить доступ к странице, «edit-account-info»"это показывает мне ошибку:

Uncaught (в обещании): Ошибка: StaticInjectorError (AppModule) [RoleGuardService]: StaticInjectorError (Платформа: core) [RoleGuardService]: NullInjectorError: Нет поставщика для RoleGuardServer!Ошибка: StaticInjectorError (AppModule) [RoleGuardService]: StaticInjectorError (Платформа: ядро) [RoleGuardService]: NullInjectorError: Нет поставщика для RoleGuardService!... ....

Ниже приведено содержимое файла role-guard.sevice.ts:

import { Injectable } from '@angular/core';
import { Router, CanActivate, ActivatedRouteSnapshot } from '@angular/router';
//import { AuthGuard } from './auth.guard';
import { CommonService } from './../services/common.service';
import { AuthGuard, DisableAuthGuard} from './auth.guard';

@Injectable()
export class RoleGuardService implements CanActivate {
  private userDetails: any;
  public user_salt: any;
  public roleName: any;

  constructor(
    //public auth: AuthService, 
    public router: Router,
    private commService: CommonService,
    private location: Location,
    ) {

    }

  canActivate(route: ActivatedRouteSnapshot): boolean {
    this.userDetails = this.commService.getSession('user');
    this.user_salt = this.commService.getSession('user_salt');
    const resultStorage = JSON.parse(this.commService.localstorageDecryption(this.userDetails, this.user_salt, 'N'));

    if (this.roleName === resultStorage.type) {
      return true;
    }

    // navigate to not found page
    this.router.navigate(['/404']);
    return false;
  }

}

Ответы [ 3 ]

1 голос
/ 15 марта 2019

Здесь вам нужно import service и Location в вашем app.module.ts и добавить его в массив providers, как показано ниже.

   import {Location, LocationStrategy, PathLocationStrategy} from '@angular/common';
   import { RoleGuardService } from '../../_guards/role-guard.service';     
   import { AuthGuard, DisableAuthGuard} from '../../_guards/auth.guard';
    ....
    ....
    exports : [
        // 
      ],
      providers: [AuthGuard, RoleGuardService, 
        Location, {provide: LocationStrategy, useClass: PathLocationStrategy}
        DisableAuthGuard, {
        provide: RECAPTCHA_SETTINGS,
        useValue: {
          siteKey: environment.recaptchasiteKey,
        } as RecaptchaSettings,
      }]

Надеюсь, это поможет!

1 голос
/ 15 марта 2019

Первоначальная ошибка вызвана отсутствием добавления RoleGuardService к вашему providers.

@NgModule({
  ...
  providers: [AuthGuard, DisableAuthGuard, RoleGuardService, {
    provide: RECAPTCHA_SETTINGS,
    useValue: {
      siteKey: environment.recaptchasiteKey,
    } as RecaptchaSettings,
  }]
  ...
})

Следующая ошибка связана с инъекцией в ваш RoleGuardService.У вас private location: Location в вашем constructor, но нет оператора импорта для местоположения Angular.

import { Location } from '@angular/common';
0 голосов
/ 15 марта 2019

Вам нужно добавить RoleGuardService в app.module.ts

, вот пример:

import { AuthGuard, DisableAuthGuard} from '../../_guards/auth.guard';
@NgModule({
providers: [ 
...
RoleGuardService
],
imports: [ 
...
]
}
})
...