首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何启用NestJS与Nx中的角之间共享的Swagger接口?

如何启用NestJS与Nx中的角之间共享的Swagger接口?
EN

Stack Overflow用户
提问于 2020-05-11 00:54:00
回答 2查看 4.7K关注 0票数 11

我想启用Swagger接口,在Nx中NestJS和角应用程序之间共享。有没有一个一致的,而不是一个解决办法?

以下是我尚未成功的方法:

方法1.将@nestjs/swagger装饰器应用于共享的DTO类

  • npx create-nx-workspace@latest创建一个新的Nx
  • 选择angular-nest工作区蓝图
  • 安装Swagger依赖项并根据指南引导它
  • Message中添加app.component.ts类型的输入(只用于测试,没有意义):
代码语言:javascript
复制
export class AppComponent {
  @Input() message: Message;

  hello$ = this.http.get<Message>('/api/hello');
  constructor(private http: HttpClient) {}
}
  • message中用ApiProperty()装饰api-interfaces.ts属性
代码语言:javascript
复制
import { ApiProperty } from '@nestjs/swagger';

export class Message {
  @ApiProperty()
  message: string;
}
  • 运行NestJS应用程序。工作正常,Swagger在Web视图中显示正确的DTO结构
  • 然而,当我启动“角”应用程序时,我会得到错误:
代码语言:javascript
复制
WARNING in ./node_modules/@nestjs/common/utils/load-package.util.js 8:39-59
Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/express/lib/view.js 81:13-25
Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/@nestjs/mapped-types/dist/type-helpers.utils.js
Module not found: Error: Can't resolve 'class-transformer' in '.\node_modules\@nestjs\mapped-types\dist'

ERROR in ./node_modules/@nestjs/common/cache/cache.providers.js
Module not found: Error: Can't resolve 'cache-manager' in '.\node_modules\@nestjs\common\cache'
ERROR in ./node_modules/@nestjs/common/pipes/validation.pipe.js
Module not found: Error: Can't resolve 'class-transformer' in '.\node_modules\@nestjs\common\pipes'
...

这看起来像一个捆绑问题,类似于这一个。我还没有找到任何优雅的工作解决方案来修复它的角度构建。

方法2.使用NestJS Swagger插件并避免使用装饰器

这甚至会是一个更好的方法,但它没有工作,尽管。首先,Swagger插件需要NestJS CLI,在中不是这样。有一个问题提出了一些解决办法,但我还没有发现它们是否足够可靠和完整。第二,插件没有涵盖一些重要的用例,无论如何,这些用例仍然需要装饰人员。例如:

代码语言:javascript
复制
@ApiProperty({
  oneOf: [{ $ref: getSchemaPath(TypeA) }, { $ref: getSchemaPath(TypeB) }],
})
type: TypeA | TypeB;

正如上面所描述的,装饰师会导致错误。

方法3.在DTO类之外创建接口,以便在角应用程序中专用

在这种方法中,吸引我的是从后端特定逻辑( Swagger、序列化或验证修饰器)中抽象出来的能力。我们可以做以下工作:

代码语言:javascript
复制
// Expose to the back-end
export class MessageDto {
  @ApiProperty()
  message: string;
}

// Expose to the front-end
export interface Message extends MessageDto {}

在这种情况下,Message接口可以很好地用interface编译。但是,一旦我们引入更复杂的DTO组合(带有嵌套DTO的类),这种方法就无法工作。

如果有其他想法,我将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2020-08-10 03:11:35

我已经成功地在角和Nest.js之间共享了DTO(逼近#1)。

@angular-devkit/build-angular:browser替换为@angular-builders/custom-webpack:browser解决了构建或服务角度应用程序时的错误。

有关更多详细信息,请参阅https://github.com/nestjs/nest/issues/1706#issuecomment-474657479

票数 2
EN

Stack Overflow用户

发布于 2020-10-27 17:02:10

作为简单的解决方法,您可以使用ApiModelProperty装饰器而不是ApiProperty:

代码语言:javascript
复制
import { ApiModelProperty } from '@nestjs/swagger/dist/decorators/api-model-property.decorator';

ApiModelProperty不会导致缓存管理器注入问题,装饰器将允许您设置DTO的API文档。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61720662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档