【问题标题】:Extending HTTP module in Angular2 throws error在 Angular2 中扩展 HTTP 模块会引发错误
【发布时间】:2017-03-05 23:12:48
【问题描述】:

我正在尝试扩展 Angular2 HTTP 模块以创建各种 HTTP 拦截器。唯一的问题是当我尝试扩展此模块时出现以下错误:

No provider for ConnectionBackend!

我不知道为什么会发生这种情况,而且似乎无法解决这个错误。

这是我的自定义 HTTP 模块:

import { Injectable } from "@angular/core";
import { Http, ConnectionBackend, RequestOptions, Request, RequestOptionsArgs, Response } from "@angular/http";
import { Observable } from "rxjs";

@Injectable()
export class HttpInterceptor extends Http {
    constructor(
        backend: ConnectionBackend,
        defaultOptions: RequestOptions
    ) {
        super(backend, defaultOptions);
    }

    request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
        console.log('request...');
        return super.request(url, options).catch(res => {
            // do something
        });
    }

    get(url: string, options?: RequestOptionsArgs): Observable<Response> {
        console.log('get...');
        return super.get(url, options).catch(res => {
            // do something
        });
    }
}

这是我的 app.module.ts 文件:

import 'app/rxjs-extensions';

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { HttpModule } from "@angular/http";
import { FormsModule } from "@angular/forms";

import { AuthGuard } from "./guards/auth.guard";
import { routing } from "./app.routing";

import { AppComponent }   from './app.component';

import { HomeComponent } from "./components/home/HomeComponent";
import { LoginComponent } from "./components/login/LoginComponent";
import { NavBarComponent } from "./components/navbar/NavBarComponent";
import { ProductComponent } from "./components/catalog/products/ProductComponent";

import { GlobalEventsManager } from "./services/globalEventsManager.service";
import { AuthService } from "./services/auth.service";
import { ToastModule } from 'ng2-toastr/ng2-toastr';
import { LeftNavComponent } from "./components/left-nav/left-nav-component";
import { SettingsComponent } from "./components/settings/settings-component";
import { UsersComponent } from "./components/users/users-component";
import { OptionsComponent } from "./components/catalog/options/OptionsComponent";
import { CategoriesComponent } from "./components/catalog/categories/CategoriesComponent";
import { ManufacturersComponent } from "./components/catalog/manufacturers/ManufacturersComponent";
import { ProductSearchComponent } from "./components/catalog/products/directives/ProductSearchComponent";
import { ProductListComponent } from "./components/catalog/products/directives/ProductListComponent";
import { ProductService } from "./services/product.service";
import { HttpInterceptor } from "./services/HttpInterceptor.service";


@NgModule({
    imports: [
        BrowserModule,
        HttpModule,
        FormsModule,
        routing,
        ToastModule
    ],
    declarations: [
        AppComponent,
        HomeComponent,
        LoginComponent,
        NavBarComponent,
        ProductComponent,
        ProductSearchComponent,
        ProductListComponent,
        LeftNavComponent,
        SettingsComponent,
        UsersComponent,
        OptionsComponent,
        CategoriesComponent,
        ManufacturersComponent
    ],
    providers: [
        AuthService,
        AuthGuard,
        GlobalEventsManager,
        ProductService,
        HttpInterceptor
    ],
    bootstrap:    [ AppComponent ]
})

export class AppModule { }

我尝试将我的 HttpInterceptor 模块放在此文件的提供程序数组中,但这仍然不起作用。谁能告诉我为什么这不起作用?

谢谢!

【问题讨论】:

    标签: http angular typescript


    【解决方案1】:

    您必须像这样自己构建并提供您的扩展类:

        ProductService,
        {
            provide: HttpInterceptor,
            useFactory: (backend: XHRBackend, defaultOptions: RequestOptions) =>
                new HttpInterceptor(backend, defaultOptions),
            deps: [XHRBackend, RequestOptions]
        }
    ],
    

    【讨论】:

    • 不幸的是这不起作用..我得到一个'xhrBackend is not defined'错误
    • 是的,就在您发布更新的答案时,才意识到这一点!干得好!
    • 在那里注入另一个“MyService”怎么样?我在提供声明和HttpInterceptor 构造函数中添加它并得到No provider for MyService
    • 在浏览器平台上使用XHRBackend 可以正常工作,但在服务器平台上会出现一些问题。对我来说,在解析防护中使用扩展的 http 客户端时,路由无法正常工作。
    【解决方案2】:

    另外,如果你想在那里注入另一个 MyService,你可以这样做

       {
          deps: [XHRBackend, RequestOptions, MyService],
          provide: HttpInterceptor,
          useFactory: (backend: XHRBackend, defaultOptions: RequestOptions, myService: MyService) =>
            new HttpInterceptor(backend, defaultOptions, myService),
        },
    

    之后,只需在HttpInterceptor 中注入MyService

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 2017-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多