gpt4 book ai didi

javascript - Angular 2 - 无法实例化循环依赖

转载 作者:数据小太阳 更新时间:2023-10-29 04:21:13 24 4
gpt4 key购买 nike

我创建自定义 XHRBackend 类来全局捕获 401 错误。在 AuthService 中,我有两种使用 http 的方法 - 登录和 refreshToken。所以我有这样的依赖链:Http -> customXHRBackend -> AuthService -> Http。我该如何解决这个问题?

export class CustomXHRBackend extends XHRBackend {
constructor(browserXHR: BrowserXhr,
baseResponseOptions: ResponseOptions,
xsrfStrategy: XSRFStrategy,
private router: Router,
private authService: AuthService) {
super(browserXHR, baseResponseOptions, xsrfStrategy);
}

createConnection(request: Request): XHRConnection {
let connection: XHRConnection = super.createConnection(request);
connection.response = connection.response
.catch(this.handleError.bind(this));

return connection;
}

handleError(error: Response | any) {
console.log('ERROR',error['status']);
if(error['status'] === 401) {
this.authService.logout();
this.router.navigate(['/']);
}

return Observable.throw(error);
}
}

AuthService.ts

@Injectable()
export class AuthService {
private loggedIn: boolean = false;

constructor(private http: Http) {
this.loggedIn = !!localStorage.getItem('authToken');
}

login(email: string, password: string): Observable<Response> {
let headers: Headers = new Headers();
headers.set('Content-Type', 'application/json');

return this.http.post('https://httpbin.org/post',
{
email: email,
password: password
},
{
headers: headers
})
.map((response) => {
let res = response.json();

// if (res['success']) {
if (res) {
localStorage.setItem('authToken', res['token']);
localStorage.setItem('refreshToken', res['refreshToken']);
console.log('logged');
this.loggedIn = true;
}

return response;
}
);
}

logout(): void {
localStorage.removeItem('authToken');
this.loggedIn = false;

console.log('Logged out');
}

isLogged(): boolean {
return this.loggedIn;
}

refreshToken(): Observable<Response> {
let headers: Headers = new Headers();
headers.set('token', localStorage.getItem('token'));
headers.set('refreshToken', localStorage.getItem('refreshToken'));

return this.http.get('https://httpbin.org/get', {
headers: headers
});
}

}

在 app.module.ts 中包含 CustomXHRBackend

{
provide: XHRBackend,
useFactory: (browserXHR: BrowserXhr,
baseResponseOptions: ResponseOptions,
xsrfStrategy: XSRFStrategy,
router: Router,
authService: AuthService) => {
return new CustomXHRBackend(browserXHR, baseResponseOptions, xsrfStrategy, router, authService);
},
deps: [BrowserXhr, ResponseOptions, XSRFStrategy, Router, AuthService]
}

最佳答案

HTTP 拦截器怎么样...有一篇博客文章 here .
如果你谷歌你会发现更多... Here's你如何将一个连接到你的应用程序模块您可以在拦截器中克隆请求并将 X-CustomAuthHeader 添加到 header 等中

关于javascript - Angular 2 - 无法实例化循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41243410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com