typescript - TypeOrm-Postgres-NestJs @Column('decimal') กำลังส่งคืนค่าเป็นสตริง
ฉันมีคอลัมน์บางคอลัมน์ที่มีชนิดเป็นทศนิยม ฉันกำลังใช้ตัวสร้างคำสั่งค้นหาเพื่อการรวม ผลลัพธ์เดียวที่มีปัญหาคือหลังจากการรวม ค่าในฟิลด์ที่เป็นทศนิยมจะถูกส่งกลับเป็นสตริงหลังจากการรันคำสั่งค้นหา
ฉันต้องการตั้งค่านี้ทั่วทั้งโครงการของฉันเพื่อพิจารณาตัวเลขทศนิยมในเอนทิตีเป็นตัวเลขทศนิยมเท่านั้นขณะรันคิวรี ไม่ใช่สตริง
ฉันพยายามใช้ transformer กับ @Column() แล้วแต่มันไม่ทำงาน
@Column('decimal', {
transformer: {
to(value) {
return value;
},
from(value) {
return parseFloat(value);
},
},
})
price: number;
แต่แม้ว่ามันจะใช้ได้ ฉันก็ไม่อยากเขียนสิ่งเดียวกันสำหรับทุกคอลัมน์ ฉันอยากทำให้การตั้งค่านี้เป็นแบบทั่วโลก
คำตอบ #1
นี่เป็นมาตรการป้องกันที่รู้จักใน PostgreSQL เนื่องจากการดำเนินการแบบรวมสามารถทำให้เกิดค่าที่อยู่นอกช่วงของประเภท number ใน JavaScript ดังนั้นเพื่อความปลอดภัย ค่าดังกล่าวจะถูกส่งคืนเป็น string
มาตรการป้องกันที่คล้ายกันก็มีอยู่ใน mysql ด้วยเช่นกัน (ซึ่งสามารถจัดการได้โดยใช้การตั้งค่า supportBigNumbers: false ในแพ็กเกจ node-mysql)
คุณสามารถสร้างตัวแปลง NestJS (ดังตัวอย่างด้านล่าง) แล้วนำไปใช้ซ้ำในเอนทิตีของคุณได้ คุณสามารถปรับ precision และ scale ให้เหมาะกับความต้องการของคุณ
// transformer
export class DecimalColumnTransformer {
to(data: number): number {
return data;
}
from(data: string): number {
return parseFloat(data);
}
}
// entity
@Column('decimal', {
precision: 5,
scale: 2,
transformer: new DecimalColumnTransformer(),
})
price: number;
