2

我目前有一个如下所示的模块设置(摘录);

AppModule

  RoutingModule
    AuthRouteGuard

  AuthModule
    LoginFormComponent
    AuthService        

我已将 my AuthService(负责处理用户身份验证并提供确定当前用户是否经过身份验证的方法)定义为 my 中的提供程序AuthModule

// auth.module.ts - uses https://github.com/auth0/angular2-jwt

export function authHttpServiceFactory(http: Http, options: RequestOptions) {
  return new AuthHttp(new AuthConfig({
    tokenName: jwtLocalStorageKey
  }), http, options);
}

export let authHttpServiceProvider = {
  provide: AuthHttp,
  useFactory: authHttpServiceFactory,
  deps: [Http, RequestOptions]
};

@NgModule({
  imports: [
    CommonModule,
    FormsModule,
    ReactiveFormsModule
  ],
  exports: [AuthComponent],
  declarations: [AuthComponent, LoginComponent, RegisterComponent],
  providers: [
    AuthService,
    authHttpServiceProvider
  ]
})
export class AuthModule { }

我可以在其同级中毫无问题地使用此服务LoginFormComponent。但是,当我尝试AuthServiceAuthRouteGuard类中使用RoutingModule时,出现以下错误;

Error: Invalid provider for the NgModule 'AuthModule' - only instances of Provider and Type are allowed, got: [?undefined?, ...]

AuthModuleRoutingModule. 一旦AuthService被定义为AuthRouteGuard;的依赖项,就会发生上述错误。

export class AuthRouteGuard implements CanActivate {
  constructor(
    private router: Router,
    private authService: AuthService // Removing this injection removes the error
  ) {}

  canActivate() {
    // @todo: if not authenticated
    this.router.navigate(['/login']);

    return true;
  }
}

我在这里遗漏了什么,为什么在构造函数中注入服务会导致无效的提供程序错误,而该错误在删除该注入时不会发生?

编辑authHttpServiceProvider- 如果完全删除提供程序,则会发生相同的错误,因此AuthModule模块看起来像;

@NgModule({
  imports: [
    CommonModule,
    FormsModule,
    ReactiveFormsModule
  ],
  exports: [AuthComponent],
  declarations: [AuthComponent, LoginComponent, RegisterComponent],
  providers: [
    AuthService
  ]
})
export class AuthModule { }
4

2 回答 2

0

真正的问题在于AuthService它本身。

AuthModule定义了一个常数;

export const jwtKey = 'jwt';

哪个被导入AuthService并使用;

import { jwtKey } from '../auth.module';

出于某种原因,如果我删除此导入,一切正常。

于 2017-03-19T14:30:17.797 回答
0

添加authHttpServiceProvider到模块的导入。它被导出到全局并且对模块不可用。所以你不能提供服务,因为你有未知的模块提供者。

@NgModule({
  imports: [
    CommonModule,
    FormsModule,
    ReactiveFormsModule
  ],
  exports: [AuthComponent],
  declarations: [AuthComponent, LoginComponent, RegisterComponent],
  providers: [
    AuthService
  ]
})
export class AuthModule { 
于 2017-03-19T13:26:50.820 回答