javascript - 如何从 TypeORM 属性装饰器中获取值
问题描述
import { PrimaryColumn, Column } from 'typeorm';
export class LocationStatus {
@PrimaryColumn({ name: 'location_id' })
locationId: string;
@Column({ name: 'area_code', type: 'int' })
areaCode: number;
}
我花了过去几个小时试图弄清楚如何从属性装饰器中检索名称属性值location_id
,但没有运气。我不确定是否甚至可以获得属性列表。area_code
@Column()
解决方案
从typeorm
源代码(这里:1 , 2 , 3 , 4typeormMetadataArgsStorage
)来看,您可以通过全局变量(如window.typeormMetadataArgsStorage
or )访问各种东西global.typeormMetadataArgsStorage
。探索它,我相信你会找到你正在寻找的东西:
const global_context = ??? // depends on your environment
const property_to_look_for = `areaCode`
const name = global_context.typeormMetadataArgsStorage
.columns
.filter(col => col.propertyName === property_to_look_for && col.target === LocationStatus)
.options
.name
console.log(name)
更新
对于那些目前Nest
像我一样使用的人,这是我到目前为止所做的。
import { getMetadataArgsStorage, InsertResult } from 'typeorm';
export class PinLocationStatusRepository extends Repository<PinLocationStatus> {
// Column names in this array, the value should not be modified.
// For instance, the location_id value "location_ko_01" won't be changed.
private static immutableColumnNames = ['location_id', ...];
private static mutableColumnFound(name: string): boolean {
return PinLocationStatusRepository.immutableColumnNames.every(colName => colName !== name);
}
savePinLocation(state: PinLocationStatus): Promise<InsertResult> {
const columns = getMetadataArgsStorage()
.columns.filter(({ target }) => target === PinLocationStatus)
.map(({ options, propertyName }) => (!options.name ? propertyName : options.name))
.reduce((columns, name) => {
if (PinLocationStatusRepository.mutableColumnFound(name)) {
columns.push(name);
}
return columns;
}, []);
return this.createQueryBuilder()
.insert()
.into(PinLocationStatus)
.values(state)
.orUpdate({ overwrite: columns }) // ['area_code']
.execute();
}
}
@Column()
从装饰器中提取列名。- 过滤掉一些值必须保持不变的列名。
- 将列变量传递给
overwrite
属性。
area_code
除非是不可变列,否则您将获得正确的结果。
推荐阅读
- r - 如何在ggplot中将对象图例添加到地图中
- html - HTML 输入模式中的正则表达式不起作用,但表达式有效
- python - 检查一个值是否是列表的第一次出现并在 Python 中标记为 1
- styled-components - 如何使用 JSDoc 为 styled.div 提供属性类型?
- sql - 解决一个 sqlplus 查询
- swift - 如何在 Swift 中保存按钮图像状态?
- unit-testing - Azure DevOps - 使用“dotnet test --collect:'Code Coverage'”时构建不显示代码覆盖率
- c - C中的变量声明
- javascript - HTML 表单在提交时未调用 JS 函数
- java - 滚动 LogBack - 无法为 [c:\var...] 创建父目录