#http #angular #typescript
#http #angular #typescript
Вопрос:
Я пытаюсь расширить HTTP-модуль Angular2, чтобы создать своего рода 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 { }
Я попытался разместить модуль my HttpInterceptor внутри массива providers в этом файле, и это все еще не работает. Кто-нибудь может сказать мне, почему это не работает?
Спасибо!
Ответ №1:
Вы должны создать и предоставить свой расширенный класс самостоятельно, вот так:
ProductService,
{
provide: HttpInterceptor,
useFactory: (backend: XHRBackend, defaultOptions: RequestOptions) =>
new HttpInterceptor(backend, defaultOptions),
deps: [XHRBackend, RequestOptions]
}
],
Комментарии:
1. К сожалению, это не работает.. Я получаю сообщение об ошибке «xhrBackend не определен»
2. Да, только что понял это, как только вы опубликовали свой обновленный ответ! работает отлично, приветствую!
3. как насчет внедрения другого «MyService» туда? Я добавляю ее в объявление provide, а также в
HttpInterceptor
конструктор и получаюNo provider for MyService
4. Использование
XHRBackend
отлично работает на платформе браузера, но имеет некоторые проблемы на серверной платформе. Для меня маршрутизация не работает нормально при использовании расширенного http-клиента в resolve guards.
Ответ №2:
Кроме того, если вы хотите внедрить туда другой MyService, вы можете сделать
{
deps: [XHRBackend, RequestOptions, MyService],
provide: HttpInterceptor,
useFactory: (backend: XHRBackend, defaultOptions: RequestOptions, myService: MyService) =>
new HttpInterceptor(backend, defaultOptions, myService),
},
После этого просто введите MyService
в HttpInterceptor