บันทึก Unix Epoch Timestamp ไปยัง Mongoose Schema ประเภท Date โดยใช้ NodeJS

ฉันได้รับการตอบกลับจากปลายทาง Stripe API GET /invoices ที่ส่งคืนวันที่เป็นการประทับเวลา Unix ค่าตัวอย่างคือ 1573917475 ฉันต้องบันทึกค่านี้ในรูปแบบ ISO ใน Mongoose ตัวอย่าง: 2019-11-16T15:17:55 ฉันคุ้นเคยกับวิธีแปลงค่านี้เป็นค่าวันที่และเวลาที่จัดรูปแบบ ISO / UTC โดยใช้ Javascript หรือ MomentJS อย่างไรก็ตาม ฉันต้องการตั้งค่าลักษณะการทำงานนี้ใน Mongoose Schema หากเป็นไปได้

การตอบสนองของ API ที่มีค่าการประทับเวลา:

{
    "period_end": 1576509475,
    "period_start": 1573917475
}

สคีมาพังพอน:

new Schema({
 ... redacted ...
    period_end: { type: Date },
    period_start: { type: Date },
 ... redacted ...
});

ขณะนี้กำลังบันทึกวันที่ as ใน Mongo ด้วยค่าต่างๆ เช่น:

{
    "period_end": "1970-01-19T04:34:23.671+0000" 
}

เมื่อถึงปี 1970 มักเป็นเพราะปัญหาเกี่ยวกับรูปแบบวันที่ป้อนข้อมูล การแปลงประเภทนี้สามารถทำได้ในระดับสคีมาหรือไม่

ฉันเห็นเอกสาร Mongoose นี้ https://mongoosejs.com/docs/tutorials/dates.html ที่กล่าวถึงการแปลงค่าก่อนที่จะบันทึกลงในสคีมา แต่ฉันไม่ต้องการวนซ้ำค่าด้วยตนเองเนื่องจากฉันกำลังบันทึกการตอบสนองดิบจาก API

แก้ไข: การใช้คำตอบที่ได้รับจาก @ambianBeing ฉันพบวิธีแก้ปัญหาต่อไปนี้

new Schema({
 ... redacted ...
    period_end: { type: Date, set: d => convertSecsToMs(d) },
    period_start: { type: Date, set: d => convertSecsToMs(d) },
 ... redacted ...
});

function convertSecsToMs(d) {
  if (!d || !isValidTimestamp(d)) return;

  return new Date(d * 1000);
}

function isValidTimestamp(date) {
  return new Date(date).getTime() > 0;
}

person Andrew Taylor    schedule 17.12.2019    source แหล่งที่มา
comment
การประทับเวลา UNIX มีหน่วยเป็นวินาที JavaScript ทำงานในหน่วยมิลลิวินาที คุณต้องคูณค่าการประทับเวลานั้นด้วย 1,000   -  person Pointy    schedule 17.12.2019
comment
ใช่ ฉันสามารถทำการแปลงด้วยตนเองได้ คำถามของฉันเป็นไปตามแนวของ สิ่งนี้สามารถทำได้ในสคีมาหรือไม่   -  person Andrew Taylor    schedule 17.12.2019


คำตอบ (1)


Mongoose รองรับ setters/getters ในระดับสคีมาซึ่งใช้งานได้กับ อัปเดตการดำเนินการ

const docSchema = new Schema({
  period_start: {
    type: Date,
    set: d => new Date(d * 1000)
  },
  period_end: {
    type: Date,
    set: d => new Date(d * 1000)
  }
});
person ambianBeing    schedule 17.12.2019
comment
ตราบใดที่ฉันทำ findOneAndUpdate ด้วยตัวเลือก { new: true, upsert: true, passRawResult: true } ฉันควรจะโอเค ดูเหมือนว่าจะทำงานได้ดี - person Andrew Taylor; 17.12.2019