有没有办法在 NestJS 中映射具有不同名称的字段?

Is there a way to map fields with different names in NestJS?

我目前正在开发一个与 SAP(以及其他一些外部应用程序)通信的 NestJS 应用程序,不幸的是,SAP 需要一些非常具体命名的字段。准确地说,在某些情况下,我需要向它发送超过 70 个字段,而在其他情况下,一个请求可能 return 超过 280 个字段。

由于我无法修改 SAP,我不得不使用违反我的应用程序命名模式(驼峰式和可读)的字段,因为 SAP 使用 SCREAMING_SNAKE_CASE 缩写、数字甚至一些混淆英语和德语单词的单词。

现在,我知道有一些不太实用的方法(比如单独解析每个字段),但是有没有什么方法可以节省我的时间,或者至少让一切变得更干净,而无需手动解析字段?

编辑:这是 SAP return 对我的应用程序的示例

PLNT_FABRIZIEREN_C: '253D',
MRKD_PRODUCTS: ['PRODUCT1', 'PRODUCT2'],
NEUES_PRDKT: TRUE

我的应用程序中的等价物:

factoryPlantCode: '253D',
markedProducts: ['PRODUCT1', 'PRODUCT2'],
isNewProduct: true

在我的应用程序中保存字段名称时,我需要完全更改它,因此我仍在使用驼峰式命名法,但仍以 SAP 知道的名称发回。

你可以尝试这样的事情。您需要做的就是在 key 中添加来自 SAP 的键,并将 value 设置为您要在应用程序中使用的键。

const mappings = {
  PLNT_FABRIZIEREN_C: "factoryPlantCode",
  MRKD_PRODUCTS: "markedProducts",
  NEUES_PRDKT: "isNewProduct"
}

const getFormattedVersion = (data) => {
  const returnData = {};
  Object.keys(data).forEach(key => {
    returnData[mappings[key]] = data[key];
  })
  return returnData
}

const getSAPSupportedVersion = (data) =>{
  const returnData = {};
  Object.keys(data).forEach(key => {
    const mappingKeys = Object.keys(mappings)
    const mappingValues = Object.values(mappings)
    const mappedKey = mappingKeys[mappingValues.indexOf(key)];
    
    returnData[mappedKey] = data[key];
  })

  return returnData
}

console.log(
   getFormattedVersion({ 
      PLNT_FABRIZIEREN_C: '253D',
      MRKD_PRODUCTS: ['PRODUCT1', 'PRODUCT2'],
            NEUES_PRDKT: true 
    })
)

console.log(
   getSAPSupportedVersion({
     factoryPlantCode: "253D",
     isNewProduct: true,
     markedProducts: ["PRODUCT1", "PRODUCT2"]
  })
)

感谢 Sony Bamniya 回答我的问题,但我想出了另一种处理该问题的方法。通过使用 class-transformer 包,我能够重命名我的字段:

@Expose({ name: 'factoryPlantCode' })
PLNT_FABRIZIEREN_C: string

@Expose({ name: 'markedProducts' })
MRKD_PRODUCTS: string;

@Expose({ name: 'isNewProduct' })
NEUES_PRDKT: boolean;

我仍然遇到 SCREAMING_SNAKE_CASE 字段的问题,但这很容易解决:我添加了一个拦截器,使用 lodash [= 解析了从 SCREAMING_SNAKE_CASEcamelCase 的所有这些字段 .camelCase 和使用 Object.entries(payload) 的手工迭代。 还值得一提的是我的 DTO 有一个构造函数:

  constructor(rawPayload) {
    Object.assign(this, rawPayload);
  }

并且在填充我的 DTO 之后,我不得不使用 class-transformer classToPlain() 方法将它变成一个普通对象(我可以在将它解析为普通对象后将其解析回 DTO,但是我不需要它)。 希望这对某人有所帮助!