【问题标题】:NestJS: How to handle custom directors errorsNestJS:如何处理自定义导向器错误
【发布时间】:2021-07-18 16:03:14
【问题描述】:

我有一个 NestJS 后端应用程序。

my-controller.ts

import { Roles } from 'private-npm';

export class myController {
    constructor(private readonly service: MyService) { }

---> @ClientRoles({ roles: ['test-role'] })
    @Get()
    @ApiOperation({ title: 'List users' })
    async listUsers(): IUser[] {
      return this.service.listUsers(); 
    }
}

@ClientRoles 抛出 Permission not fulfilled, 403 (FORBIDDEN) 错误,如果用户没有所需的角色(例如 test-role)。

问题是,我可以在终端中看到错误消息(错误:权限未完成),但我在 Swagger UI 响应中没有收到相同的错误消息正文

我在 Swagger UI 中收到以下错误消息,而不是错误消息。

{
  "statusCode": 500,
  "message": "Internal server error"
}

也很难调试。

感谢任何帮助。

【问题讨论】:

  • 装饰器如何通过错误?

标签: node.js express nestjs nestjs-swagger


【解决方案1】:

你的守卫不应该抛出错误。它应该实现 CanActivate 接口并具有 canActivate 方法,如果访问被拒绝,则返回 boolean | Promise<boolean> | Observable<boolean>false。你应该把它传递给@UseGuards 装饰器。阅读更多关于警卫的信息:https://docs.nestjs.com/guards

通常最佳实践是让一个 Guard 读取另一个装饰器写入的元数据。例如:

@Roles(['roleA', 'roleB'])
@UseGuards(new RoleGuard())

尽管您可以通过创建一个工厂函数来组合它们,并为其传递角色并返回保护实例。

【讨论】:

    猜你喜欢
    • 2020-10-20
    • 2019-11-17
    • 2020-03-18
    • 2013-02-12
    • 2011-01-29
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多