如何重命名 nest.js 中的 JSON 字段

How to rename JSON fields in nest.js

我想知道在 nest.js 中重命名反序列化器字段的正确方法是什么。对于下面给定的对象:

export class User {

  contact_email?: string;

}

contact_email 是我们数据库中的一个字段,但它与正在发送 contactEmail.

的当前应用冲突

我尝试了以下给定的解决方案:

import { Expose } from 'class-transformer';

export class User {

  @Expose({ name: "contactEmail" })
  contact_email?: string;

}

上面的这个完全重命名了字段,并且在使用对象时,它根本被转换为 contactEmail,而不仅仅是从 JSON(字符串)转换为 Class。然后我尝试了以下解决方案:

import { Transform } from 'class-transformer';

export class User {

  @Transform(key => "contactEmail", { toClassOnly: true })
  contact_email?: string;

}

这个案例好像也不行。

来自应用程序的信息:

{
  "contactEmail": "email@gmail.com"
}

我想做一些类似于 rust 的 serde #rename。我可以在其中重命名 serialization/deserialization 的字段,但保留应用程序的原始名称。

我们正在使用 nest.js + fastify.js + sequelize.js.

谢谢。

好的,经过一些挖掘,我有一个解决方法,但正如您将看到的那样,它是一个丑小鸭/黑客:

  @Expose()
  @Transform(
    ({value, obj, type}) => {
      console.log(value, obj, type);
      if (obj['contact_email']) {
        return obj['contact_email'];
      } else {
        return value;
      }
    }
  )
  contactEmail?: string;

这对你有用吗?

使用三元语句 trim 向下一点:

  @Expose()
  @Transform(
    ({value, obj}) =>
      typeof value === 'undefined' ? obj['contact_email'] : value
  )
  contactEmail?: string;

我可能应该就 class-transform 项目寻求澄清,因为我怀疑这不是故意的。

我在将日志放入 @Transform 装饰器后注意到,在第一次通过 value 时是 undefined,但在第二次通过时它有一个值。

我知道它被调用了两次,我想一次是在调用 plainToClass,然后是在序列化期间。

希望此变通办法对您有所帮助或为您解决问题。