ค้นหาเว็บไซต์

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;