【问题标题】:classToPlain transformation doesn't apply with routing-controllersclassToPlain 转换不适用于路由控制器
【发布时间】:2020-04-08 19:13:45
【问题描述】:

关于类转换器和路由控制器的使用。
也许是我不明白 class-transformer lib 的真正含义,但我想用它来转换从服务器(第三方)接收到的对象并将它们适应我自己的模型,使用不同的名称。理论上哪个应该有效,并且在 console.log-ing 新转换模型时有效,甚至在 JSON.stringify-ing 时有效。
但是由于某种原因,当使用路由控制器输出模型时,它只是输出相同的源对象。

用户类别:

class User {
  @Expose({ name: 'uid' }) // To convert/rename the "uid" property received from the server
  id: string
  firstName: string
  lastName: string
}

users-controller.ts:

@JsonController('/users')
export class UsersController {
  @Get('/')
  async get() {
    const user = plainToClass(User, {
      uid: '123',
      firstName: 'Matthew',
      lastName: 'Michalsky'
    })

    console.log(user)

    return user
  }
}

控制台输出期望值:

User {
  id: '123',
  firstName: 'Matthew',
  lastName: 'Michalsky'
}

但来自用户控制器(通过路由控制器库)的响应是:

{
  uid: '123',
  firstName: 'Matthew',
  lastName: 'Michalsky'
}

您看到我可能遗漏/做错了什么吗? 谢谢。

【问题讨论】:

    标签: typescript express class-transformer


    【解决方案1】:

    对。响应发回一个 json 数据,我们不能用它来传输类名。 因此,如果您从控制器返回一个类实例,routing-controllers 会在其上应用classToPlain,您会得到一个转换后的普通对象。

    如果你想跳过这个行为,你应该配置@ResponseClassTransformOption

      @ResponseClassTransformOption({
        ignoreDecorators: true,
      })
      @Get('/')
      async get() {
    

    作为一个选项,您可以设置转换方向,例如仅 toClass,然后当通过 classToPlain 处理类实例时,此类装饰器不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      相关资源
      最近更新 更多