openapi-generator-cli 生成的服务不可注入
Services generated by openapi-generator-cli not injectable
我正在尝试使用 openapi-generator-cli 从 v2 swagger 文件生成一个 API 客户端。为此,我使用了 openapi-generator-cli 的 docker 容器,它将其版本报告为“4.1.0-SNAPSHOT”。
代码生成适用于以下选项:
{
"npmName": "...",
"npmVersion": "0.0.3",
"snapshot": true,
"ngVersion": "8.1.1"
}
而且我还尝试将 providedInRoot
选项设置为 true。
但是,生成的服务 类 未使用 @Injectable
装饰器进行注释。所以在我的组件中导入它们并在组件的构造函数中添加服务后,我无法使用它们。这是我的组件的样子:
import { Component, OnInit } from '@angular/core';
import { UsersService, User } from '...'
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
constructor(userService: UsersService) {}
title = 'user-frontend';
ngOnInit() {
this.userService.listUsers();
}
}
失败,因为 userService 不存在于 AppComponent 的范围内。
这是我导入生成的模块的方式:
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { ApiModule } from '...';
import { HttpClientModule } from '@angular/common/http';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
ApiModule,
HttpClientModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
关于生成 api 客户端时我的错误在哪里有什么想法吗?
编辑:
生成的代码如下所示:
@Injectable({
providedIn: 'root'
})
export class UsersService {
protected basePath = 'http://localhost';
public defaultHeaders = new HttpHeaders();
public configuration = new Configuration();
public encoder: HttpParameterCodec;
constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string, @Optional() configuration: Configuration) {
if (configuration) {
this.configuration = configuration;
this.configuration.basePath = configuration.basePath || basePath || this.basePath;
} else {
this.configuration.basePath = basePath || this.basePath;
}
this.encoder = this.configuration.encoder || new CustomHttpParameterCodec();
}
...
}
很多问题 import { ApiModule } from '...';生成的代码来自哪里?
您将它发布到 npm 并使用它,还是只是复制粘贴生成的代码?
试试这个
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
HttpClientModule,
ApiModule.forRoot(() => {
return new Configuration({
basePath: `${environment.HOST}:${environment.PORT}`,
});
}),,
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
你生成的代码应该是这样的
@Injectable({
providedIn: 'root'
})
export class PetsService {
protected basePath = 'http://localhost';
public defaultHeaders = new HttpHeaders();
public configuration = new Configuration();
constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string, @Optional() configuration: Configuration) {
if (configuration) {
this.configuration = configuration;
this.configuration.basePath = configuration.basePath || basePath || this.basePath;
} else {
this.configuration.basePath = basePath || this.basePath;
}
}
解决方案:在构造函数中使用 private 或 public
说明:
这里我们有和你一样的问题 typescript don't know what you want
class TestClass {
constructor(name: string) {
}
}
这里我们有最后一个使用普通 POO 编程语言的示例
class TestClass {
private name: string;
constructor(name: string) {
this.name = name;
}
}
但是打字稿给了我们一个简单的方法来最小化代码
class TestClass {
constructor(private name: string) { }
}
我正在尝试使用 openapi-generator-cli 从 v2 swagger 文件生成一个 API 客户端。为此,我使用了 openapi-generator-cli 的 docker 容器,它将其版本报告为“4.1.0-SNAPSHOT”。
代码生成适用于以下选项:
{
"npmName": "...",
"npmVersion": "0.0.3",
"snapshot": true,
"ngVersion": "8.1.1"
}
而且我还尝试将 providedInRoot
选项设置为 true。
但是,生成的服务 类 未使用 @Injectable
装饰器进行注释。所以在我的组件中导入它们并在组件的构造函数中添加服务后,我无法使用它们。这是我的组件的样子:
import { Component, OnInit } from '@angular/core';
import { UsersService, User } from '...'
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
constructor(userService: UsersService) {}
title = 'user-frontend';
ngOnInit() {
this.userService.listUsers();
}
}
失败,因为 userService 不存在于 AppComponent 的范围内。
这是我导入生成的模块的方式:
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { ApiModule } from '...';
import { HttpClientModule } from '@angular/common/http';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
ApiModule,
HttpClientModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
关于生成 api 客户端时我的错误在哪里有什么想法吗?
编辑: 生成的代码如下所示:
@Injectable({
providedIn: 'root'
})
export class UsersService {
protected basePath = 'http://localhost';
public defaultHeaders = new HttpHeaders();
public configuration = new Configuration();
public encoder: HttpParameterCodec;
constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string, @Optional() configuration: Configuration) {
if (configuration) {
this.configuration = configuration;
this.configuration.basePath = configuration.basePath || basePath || this.basePath;
} else {
this.configuration.basePath = basePath || this.basePath;
}
this.encoder = this.configuration.encoder || new CustomHttpParameterCodec();
}
...
}
很多问题 import { ApiModule } from '...';生成的代码来自哪里? 您将它发布到 npm 并使用它,还是只是复制粘贴生成的代码? 试试这个
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
HttpClientModule,
ApiModule.forRoot(() => {
return new Configuration({
basePath: `${environment.HOST}:${environment.PORT}`,
});
}),,
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
你生成的代码应该是这样的
@Injectable({
providedIn: 'root'
})
export class PetsService {
protected basePath = 'http://localhost';
public defaultHeaders = new HttpHeaders();
public configuration = new Configuration();
constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string, @Optional() configuration: Configuration) {
if (configuration) {
this.configuration = configuration;
this.configuration.basePath = configuration.basePath || basePath || this.basePath;
} else {
this.configuration.basePath = basePath || this.basePath;
}
}
解决方案:在构造函数中使用 private 或 public
说明: 这里我们有和你一样的问题 typescript don't know what you want
class TestClass {
constructor(name: string) {
}
}
这里我们有最后一个使用普通 POO 编程语言的示例
class TestClass {
private name: string;
constructor(name: string) {
this.name = name;
}
}
但是打字稿给了我们一个简单的方法来最小化代码
class TestClass {
constructor(private name: string) { }
}