我试图创建一个通用服务来调用我的 API 并且构建给了我错误:
无法解析/ng-app/src/app/services/data.service.ts 中 DataService 的所有参数:(?, [object Object](。
我知道我不是第一个得到它的人,但我发现的一切都没有帮助。
这是我尝试过的:
- 检查@Injectable是否正确
- 不使用枪管
- 在构造函数参数中使用类型
- Tsconfig.json emitDecoratorMetadata 设置为 true
- 所有服务都在ngModule的提供者部分中注册
我不知道我还能尝试什么来解决它...
这是一些代码:
数据服务:
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { catchError } from 'rxjs/operators';
import { Observable } from 'rxjs';
import { AppError } from '../common/validators/app-error';
import { NotFoundError } from '../common/not-found-error';
import { BadRequest } from './../common/bad-request-error';
@Injectable({
providedIn: 'root'
})
export class DataService {
constructor(private url: string, public httpClient: HttpClient) { }
getAll(){
return this.httpClient.get(this.url).pipe(catchError(this.handleError));
}
getOne(ressource){
return this.httpClient.get(this.url + '/' + ressource).pipe(catchError(this.handleError));
}
create(ressource){
return this.httpClient.post(this.url, JSON.stringify(ressource)).pipe(catchError(this.handleError));
}
update(ressource,oldRessource){
return this.httpClient.put(this.url + '/' + oldRessource, JSON.stringify(ressource)).pipe(catchError(this.handleError));
}
delete(ressource){
return this.httpClient.delete(this.url + '/' + ressource).pipe(catchError(this.handleError));
}
public handleError(err: Response){
if (err.status == 400 ){
return Observable.throw(new BadRequest(err));
}
if (err.status == 404) {
return Observable.throw(new NotFoundError());
}
// Return error by default if no specific error
return Observable.throw(new AppError(err));
}
}
从数据服务扩展的服务
import { HttpClient } from '@angular/common/http';
import { DataService } from './data.service';
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class CategorieService extends DataService {
constructor(httpClient: HttpClient) {
super('http://localhost:8081/categories' ,httpClient);
}
}
更新:
我必须使用ToketInjection模式来解决我的问题。我还使用了环境类来避免在不同位置设置基本 URL。
但我仍然不明白现在如何为从数据服务扩展的每个服务更改数据服务中的 URL。
这是一些代码:
App.module.ts :
...
import { CategorieService } from './services/categorie.service';
import { DataService } from './services/data.service';
import { environment } from 'src/environments/environment';
export function getBaseUrl(): string {
return environment.API_BASE_URL;
}
@NgModule({
declarations: [
...
],
imports: [
...
])
],
providers: [
...
DataService,
CategorieService,
{ provide: 'API_BASE_URL', useFactory: getBaseUrl },
],
bootstrap: [AppComponent]
})
export class AppModule { }
环境网
export const environment = {
production: false,
API_BASE_URL: "http://localhost:8081/",
};
Data.service.ts
import { Injectable, Inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { catchError } from 'rxjs/operators';
import { Observable } from 'rxjs';
import { AppError } from '../common/validators/app-error';
import { NotFoundError } from '../common/not-found-error';
import { BadRequest } from './../common/bad-request-error';
@Injectable({
providedIn: 'root'
})
export class DataService {
//constructor(private url: string, public httpClient: HttpClient) { }
constructor(@Inject('API_BASE_URL') private url, public httpClient: HttpClient) { }
getAll(){
return this.httpClient.get(this.url).pipe(catchError(this.handleError));
}
getOne(ressource){
return this.httpClient.get(this.url + '/' + ressource).pipe(catchError(this.handleError));
}
create(ressource){
return this.httpClient.post(this.url, JSON.stringify(ressource)).pipe(catchError(this.handleError));
}
update(ressource,oldRessource){
return this.httpClient.put(this.url + '/' + oldRessource, JSON.stringify(ressource)).pipe(catchError(this.handleError));
}
delete(ressource){
return this.httpClient.delete(this.url + '/' + ressource).pipe(catchError(this.handleError));
}
public handleError(err: Response){
if (err.status == 400 ){
return Observable.throw(new BadRequest(err));
}
if (err.status == 404) {
return Observable.throw(new NotFoundError());
}
// Return error by default if no specific error
return Observable.throw(new AppError(err));
}
}
我想向我的基本 API URL 添加一些参数,就像我之前尝试的那样,以便能够访问我的 API 的特定部分,但我不知道如何使用 TokenInjection 做到这一点。
你真的不想在你的构造函数中放一个字符串。您可以执行诸如注入令牌之类的操作,或者将该字符串作为 const 放入您的环境文件中,然后将您的环境作为提供程序导入,就像他们在这里所做的那样。