- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Angular CLI: 11.0.1
Node: 14.8.0
OS: darwin x64
Angular: 11.0.0
... animations, cdk, common, compiler, compiler-cli, core, forms
... language-service, material, platform-browser
... platform-browser-dynamic, router
Ivy Workspace: Yes
Package Version
---------------------------------------------------------
@angular-devkit/architect 0.1002.0
@angular-devkit/build-angular 0.1100.1
@angular-devkit/core 10.2.0
@angular-devkit/schematics 11.0.1
@angular/cli 11.0.1
@schematics/angular 11.0.1
@schematics/update 0.1100.1
rxjs 6.6.3
typescript 4.0.5
当我将 translateService 与 httpInterceptor 一起使用时,出现此错误:
NG0200: Circular dependency in DI detected for InjectionToken HTTP_INTERCEPTORS
import { Component } from '@angular/core';
import { ElectronService } from './services';
import { TranslateService } from '@ngx-translate/core';
import { AppConfig } from '../environments/environment';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent {
constructor(
private electronService: ElectronService,
private translate: TranslateService
) {
this.translate.setDefaultLang('en');
console.log('AppConfig', AppConfig);
}
}
核心模块.ts
import {InjectionToken, NgModule} from '@angular/core';
import {CommonModule} from '@angular/common';
import {BrowserModule} from '@angular/platform-browser';
import {FormsModule} from '@angular/forms';
import {HttpClient, HttpClientModule} from '@angular/common/http';
import {SharedModule} from '../shared/shared.module';
import {AppRoutingModule} from '../app-routing.module';
import {TranslateLoader, TranslateModule} from '@ngx-translate/core';
import {TranslateHttpLoader} from '@ngx-translate/http-loader';
import {AppStoreModule} from '../store/app-store.module';
import {ViewsModule} from '../views/views.module';
import {httpInterceptorProvides} from '../services/http-interceptor';
import {API_BASE_URL} from '../services/service.module';
// AoT requires an exported function for factories
export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
return new TranslateHttpLoader(http, '../../assets/i18n/', '.json');
}
@NgModule({
declarations: [],
imports: [
CommonModule,
BrowserModule,
FormsModule,
HttpClientModule,
AppStoreModule,
SharedModule,
ViewsModule,
AppRoutingModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient]
}
})
],
providers: [
{
provide: API_BASE_URL,
useValue: 'https://demo.xx.com'
},
httpInterceptorProvides,
],
exports: [AppRoutingModule, SharedModule]
})
export class CoreModule {
}
httpinterceptor.ts
import {Inject, Injectable} from '@angular/core';
import {
HttpRequest,
HttpHandler,
HttpEvent,
HttpInterceptor
} from '@angular/common/http';
import {Observable} from 'rxjs';
import {switchMap} from 'rxjs/operators';
import {AuthService} from '../auth.service';
import {API_BASE_URL} from '../service.module';
@Injectable()
export class CommonInterceptor implements HttpInterceptor {
skipUrl: string[];
constructor(private auth: AuthService, @Inject(API_BASE_URL) private uri: string) {
this.skipUrl = ['/oauth/token', 'assets/i18n'];
}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const req = request.clone({
setHeaders: {
'Accept': 'dddd'
},
url: this.uri + request.url
});
// return next.handle(req);
if (this.isSkipAuth(req.url)) {
return next.handle(req);
} else {
return this.auth.getToken()
.pipe(
switchMap((access_token) => {
const reqA = req.clone({
setHeaders: {
'Authorization': 'Bearer ' + access_token
}
});
return next.handle(reqA);
})
);
}
}
isSkipAuth(url: string): boolean {
let isMatch = false;
this.skipUrl.forEach((reg_url: string) => {
if (!isMatch) {
if (url.search(reg_url) >= 0) {
isMatch = true;
}
}
});
return isMatch;
}
}
auth.service.ts
import {Injectable} from '@angular/core';
import {HttpClient} from '@angular/common/http';
import {Observable, of} from 'rxjs';
import {ElectronService} from './electron/electron.service';
import {map, pluck, tap} from 'rxjs/operators';
import {ResponseType} from './data-types/common.type';
export interface TokenModel {
access_token: string; // access_token
expires: number; //
expires_in: number; //
}
@Injectable({
providedIn: 'root'
})
export class AuthService {
elStoreIns: any;
constructor(private http: HttpClient, private elService: ElectronService) {
this.elStoreIns = this.elService.elStore;
}
getToken(): Observable<string> {
const now = Date.now();
const tokenStore: TokenModel = this.elStoreIns.get('token');
if (tokenStore instanceof Object) {
if ((now - tokenStore.expires) <= 7100 * 1000) {
return of(tokenStore.access_token);
}
}
return this.requestToken();
}
requestToken(): Observable<string> {
return this.http.post<ResponseType>('/oauth/token', {
client_ids: 1,
client_secrets: 'ddd',
grant_types: 'dddd'
}).pipe(
pluck('data'),
tap((data: any) => {
const tokenData: TokenModel = {
access_token: data.access_token,
expires_in: data.expires_in,
expires: Date.now()
};
this.saveToken(tokenData);
}),
map(data => data.access_token)
);
}
saveToken(tokenStore: TokenModel): void {
this.elStoreIns.set('token', tokenStore);
}
}
最佳答案
我不能 100% 确定它是否是一个有效且干净的解决方案,但您可以尝试在“auth.service.ts”中自行实例化“HttpClient”。从构造函数中删除 HttpClient,并尝试以下方法:
private http: HttpClient;
constructor(httpBackend: HttpBackend) {
this.http = new HttpClient(httpBackend);
}
关于angular - NG0200 : Circular dependency in DI detected for InjectionToken HTTP_INTERCEPTORS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65317838/
我目前正在学习新的 Angular 框架,我正在尝试制作一个动态搜索栏,它接受一个服务名称作为参数,以便它动态解析一个服务来查询后端服务。 为此,我使用了一个 Injector,并在 ngOnInit
我正在尝试在延迟加载模块中提供 APP_BASE_HREF 注入(inject) token ,然而,工厂方法根本没有被调用。 在这里https://github.com/MaurizioCascia
我不是 Angular 的新手,通常我知道如何处理“No provider for XYZ”错误,但在这种情况下,我不知道 Angular 对“本地化键前缀”意味着什么 我的组件是 kendo-pag
我正在尝试测试处理 SignalR 连接的 Angular 服务,它将 SignalR 的代码作为 InjectionToken。 这是提供程序文件: // signalr-provider.ts i
我正在开发 Angular 应用程序,当我打开我的项目时,它给了我如下错误 ERROR NullInjectorError: R3InjectorError(IndexModule)[Injectio
在我的 Angular 应用程序上运行 jasmine 测试时出现此错误。 Error: StaticInjectorError(DynamicTestModule)[MyEditDialogComp
尝试使用 InjectionToken 注入(inject)对象。 在AppModule中我有: export const tokenConfigKey = new InjectionToke
我正在编写一个 Angular 库,我需要在其中在模块导入的 .forRoot() 中传入一个配置对象。 我正在尝试使用 InjectionToken 执行此操作(显然是正确的方法),但出现 AoT
我是 Angular 4 Jasmine 单元测试的新手。 请帮助我获得附加组件的完整测试范围。 我已经为翻译模块添加了子依赖项,但我仍然收到错误:没有 InjectionToken USE_DEFA
我正在尝试按照 this 制作具有 ngx-translate 功能的 Angular 应用程序教程。 我执行了所有步骤,但出现错误:“异常:调用节点模块失败,出现错误:错误:没有 Injection
我正在尝试在一个包含子组件的组件中进行一些测试: 这是父组件模板: 当我尝试测试父组件时,这个“snackbar”组件给我带来了问题:“snackbar”组件与 injectionToken 有依
为什么我会得到 Error: StaticInjectorError(AppServerModule)[NgModuleFactoryLoader -> InjectionToken MODULE_M
我正在尝试将表单数据插入云 Firestore 数据库中。下面是我的 x.component.ts 文件,我在其中编写的构造函数中遇到错误 private firestore: AngularFire
我有这样的用于 Azure AD 身份验证的配置包装器 import { APP_INITIALIZER, InjectionToken, NgModule } from '@angular/core
我正在使用 Angular Materials 开发 Angular 项目。项目已使用 Angular Materials 正确设置,编译时没有任何问题,并且我能够使用多个 Angular Mater
当我启动我的 Angular 2 应用程序时,该应用程序始终处于加载阶段。 在 chrome 开发控制台中,我可以看到以下内容: Error: (SystemJS) core_1.Injection
这个问题在这里已经有了答案: NullInjectorError: No provider for InjectionToken angularfire2.app.options (4 个答案) 关
我知道 Stackoverflow 上有一些类似的问题,但它们并没有完全回答我的问题。 在我的 Angular 项目中运行 Karma 测试时,出现以下错误:NullInjectorError: No
我正在学习如何实现 Dependency Injection 的各种方法关于 Angular 5。众所周知,Angular 5 有 3 种不同的方法,用于在声明依赖项时声明提供者的 key / tok
我正在使用 VS 2017 和 Angular 2 + asp.netcore 模板开发一个项目。默认项目运行良好,但是当我在 app.module.ts 中导入 ReactiveFormsModul
我是一名优秀的程序员,十分优秀!