Simpan Stempel Waktu Epoch Unix ke Tanggal jenis Skema Mongoose menggunakan NodeJS

Saya menerima tanggapan dari titik akhir Stripe API GET /invoices yang mengembalikan tanggal sebagai cap waktu unix. Contoh nilai adalah 1573917475. Saya perlu menyimpan nilai ini dalam Format ISO di Mongoose. Contoh: 16-11-2019T15:17:55 Saya memahami cara mengonversi nilai ini menjadi nilai waktu tanggal berformat ISO/UTC menggunakan Javascript atau MomentJS. Namun, saya ingin mengatur perilaku ini dalam Skema Mongoose jika memungkinkan.

Respons API yang berisi nilai stempel waktu:

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

Skema Luwak:

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

Saat ini menyimpan tanggal di Mongo dengan nilai seperti:

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

Kalau tahun 1970 biasanya karena ada masalah dengan format tanggal input. Bisakah konversi jenis ini dilakukan pada tingkat Skema?

Saya melihat dokumentasi Mongoose ini https://mongoosejs.com/docs/tutorials/dates.html yang menyebutkan konversi nilai sebelum disimpan ke skema. Namun saya memilih untuk tidak mengulang nilai secara manual karena saya menyimpan respons mentah dari API.

Edit: Menggunakan jawaban yang diberikan oleh @ambianBeing saya menemukan solusi berikut.

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 sumber
comment
Stempel waktu UNIX dalam hitungan detik; JavaScript berfungsi dalam milidetik. Anda harus mengalikan nilai stempel waktu itu dengan 1000.   -  person Pointy    schedule 17.12.2019
comment
Ya, saya dapat melakukan konversi secara manual. Pertanyaan saya lebih mirip, bisakah ini dilakukan dalam skema?   -  person Andrew Taylor    schedule 17.12.2019


Jawaban (1)


Mongoose mendukung setters/getters pada tingkat skema yang berfungsi dengan perbarui operasi.

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
Jadi selama saya melakukan findOneAndUpdate dengan opsi { new: true, upsert: true, passRawResult: true } saya akan baik-baik saja. Tampaknya bekerja dengan baik. - person Andrew Taylor; 17.12.2019