簡體   English   中英

有沒有辦法在 NestJS 中使用不同名稱的 map 字段?

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

我目前正在開發一個與 SAP(和其他一些外部應用程序)通信的 NestJS 應用程序,不幸的是,SAP 需要一些非常具體的字段。 准確地說,在某些情況下,我需要向它發送超過 70 個字段,而在其他情況下,請求可能會返回超過 280 個字段。

由於我無法修改 SAP,因此我不得不使用與我的應用程序命名模式(camelCase 和可讀)相違背的字段,因為 SAP 使用 SCREAMING_SNAKE_CASE 和縮寫、數字甚至一些混淆了英語和德語單詞的單詞。

現在,我知道有一些不太實用的方法(比如單獨解析每個字段),但是有沒有什么方法可以節省我的時間,或者至少讓一切變得更干凈,而無需手動解析字段?

編輯:這是 SAP 返回到我的應用程序的示例

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

我的應用程序中的等價物:

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

將字段名稱保存在我的應用程序中時,我需要完全更改它,因此我仍在使用 camelCase,但仍以 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 回答了我的問題,但我想出了另一種解決這個問題的方法。 通過使用類轉換器 package,我能夠重命名我的字段:

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

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

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

我仍然遇到SCREAMING_SNAKE_CASE字段的問題,但這很容易解決:我添加了一個攔截器,它使用 lodash .camelCase 將所有這些字段從SCREAMING_SNAKE_CASE解析到camelCase並使用Object.entries Object.entries(payload)進行手工迭代。 還值得一提的是我的 DTO 有一個構造函數:

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

在填充了我的 DTO 之后,我不得不使用類轉換classToPlain()方法將它變成一個普通的 object (我可以在將它解析為純文本后將其解析回 DTO,但我不需要它)。 希望這對某人有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM