Angular2 - 将服务注入服务时无效的提供程序错误

时间:2017-03-19 12:51:34

标签: javascript angular authentication

我目前有一个模块设置如下(exerpt);

AppModule

  RoutingModule
    AuthRouteGuard

  AuthModule
    LoginFormComponent
    AuthService        

我已将AuthService(负责处理用户身份验证并提供确定当前用户是否已通过身份验证的方法)定义为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?, ...]

我在AuthModule内导入了RoutingModule。只要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 { }

2 个答案:

答案 0 :(得分:0)

authHttpServiceProvider添加到模块的导入中。它已导出到全局,不可用于模块。因此,您无法提供服务,因为您有模块的未知提供程序。

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

答案 1 :(得分:0)

实际问题在AuthService本身。

AuthModule定义了一个常量;

export const jwtKey = 'jwt';

正在导入AuthService并使用;

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

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