Angular2 中的自定义 Http 服务。循环依赖错误

亚历克斯91库阿

我创建了自定义 Http 服务来覆盖“请求”方法,如果需要,该方法会在每个请求上更新令牌。但问题是我收到“循环依赖”错误。知道如何解决吗?

自定义Http服务:

import { Injectable } from '@angular/core';
import {
    Request, XHRBackend, RequestOptions, Response, Http, RequestOptionsArgs, Headers } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
import {UserService} from "../services/user.service";

@Injectable()
export class VodHttpService extends Http {

    constructor(backend: XHRBackend, defaultOptions: RequestOptions, private userService : UserService ) {

        super(backend, defaultOptions);
    }

    request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {

        //adding access token to each http request before calling super(..,..)
        let token = this.userService.token;
        if (typeof url === 'string') {
            if (!options) {
                options = { headers: new Headers() };
            }

            if ( url != this.userService.PUBLIC_TOKEN_URL ) {
                options.headers.set('Authorization', `Bearer ${token}`);
            }
        }
        else {

            if ( url.url != this.userService.PUBLIC_TOKEN_URL ) {
                url.headers.set('Authorization', `Bearer ${token}`);
            }
        }

        console.log(url);

        return super.request(url, options)
            .catch((error) => {
                //if got authorization error - try to update access token
                if (error.status = 401) {
                    return this.userService.updateToken()
                        .flatMap((result: boolean) => {
                            //if got new access token - retry request
                            if (result) {
                                return this.request(url, options);
                            }
                            //otherwise - throw error
                            else {
                                return Observable.throw(new Error('Can\'t refresh the token'));
                            }

                        })
                }
                else {
                    Observable.throw(error);
                }
            })

    }

}

我的单身用户服务看起来像:

import {Component, Injectable, Injector} from '@angular/core';
import {Http} from "@angular/http";
import {Observable} from "rxjs";
import {environment} from "../../environments/environment";

@Injectable()
export class UserService {

    public token : string;
    public PUBLIC_TOKEN_URL = environment.token_url;

    constructor (private _http: Http) { }

    updateToken() : Observable<boolean> {

        let url = this.PUBLIC_TOKEN_URL;

        return this._http.get(url).map( res => {

            // return res.json();
            if (typeof res.json().access_token !== 'undefined'){

                this.token = res.json().access_token;
                return true;
            } else {

                return false;
            }
        });
    }

}

我知道使用 Injector 修复它的方法在哪里,但我认为这是一种丑陋的方法。

安德烈·马特拉卡鲁

您的自定义 VodHttpService 的提供程序定义不正确。它应该是这样的:

export function vodHttpFactory(backend: XHRBackend, options: RequestOptions, userService: UserService) {
      return new VodHttpService(backend, options, userService);
    }

@NgModule({
// other stuff 
providers: [ 
    UserService,
    {
      provide: VodHttpService,
      useFactory: vodHttpFactory,
      deps: [XHRBackend, RequestOptions, UserService]
    }
  ]
})

请注意,该vodHttpFactory函数是这样编写的,以便与 AOT 兼容,以防您需要它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Angular2中的HTTP服务错误

来自分类Dev

扩展http类用于自定义用法ionic2 / Angular2导致错误

来自分类Dev

在angular2的自定义Http中未定义注入的Logger

来自分类Dev

将$ http服务封装在自定义服务中时,出现自定义方法未定义错误

来自分类Dev

从Angular2中的自定义验证器访问服务

来自分类Dev

Angular2 Http未定义错误

来自分类Dev

Angular2 Http未定义错误

来自分类Dev

Angular2 Http错误

来自分类Dev

在Angular2服务中多次发出HTTP请求

来自分类Dev

扩展Http中的自定义服务未注入

来自分类Dev

在IIS 7中自定义HTTP 400错误页面

来自分类Dev

在 Django 中设置 http 错误自定义页面

来自分类Dev

扩展http类并访问自定义属性(Angular2打字稿)

来自分类Dev

扩展http类并访问自定义属性(Angular2打字稿)

来自分类Dev

Angular2共享HTTP服务

来自分类Dev

Angular2简单的Http服务注入

来自分类Dev

Angular2简单的Http服务注入

来自分类Dev

Angular2共享HTTP服务

来自分类Dev

测试angular2 http服务

来自分类Dev

将Http注入服务时Angular2 [typescript]错误

来自分类Dev

Angular2:HTTP错误处理

来自分类Dev

Angular2:从HTTP发布检测错误

来自分类Dev

Http在Angular 2自定义异步验证中不起作用

来自分类Dev

在 Angular 2 中读取自定义 HTTP 响应标头

来自分类Dev

Flurl.Http自定义错误

来自分类Dev

引导中的Angular2 http

来自分类Dev

Angular2:无法订阅从共享服务发出的自定义事件

来自分类Dev

在Angular2的自定义验证器中注入服务

来自分类Dev

angular2 –通过自定义管道使用全局服务