有没有办法在 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_CASE
到 camelCase
的所有这些字段 .camelCase 和使用 Object.entries(payload)
的手工迭代。
还值得一提的是我的 DTO 有一个构造函数:
constructor(rawPayload) {
Object.assign(this, rawPayload);
}
并且在填充我的 DTO 之后,我不得不使用 class-transformer classToPlain()
方法将它变成一个普通对象(我可以在将它解析为普通对象后将其解析回 DTO,但是我不需要它)。
希望这对某人有所帮助!
我目前正在开发一个与 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_CASE
到 camelCase
的所有这些字段 .camelCase 和使用 Object.entries(payload)
的手工迭代。
还值得一提的是我的 DTO 有一个构造函数:
constructor(rawPayload) {
Object.assign(this, rawPayload);
}
并且在填充我的 DTO 之后,我不得不使用 class-transformer classToPlain()
方法将它变成一个普通对象(我可以在将它解析为普通对象后将其解析回 DTO,但是我不需要它)。
希望这对某人有所帮助!