Сохраните временную метку эпохи Unix в дату типа схемы Mongoose, используя NodeJS

Я получаю ответы от конечной точки GET /invoices Stripe API, которая возвращает даты в виде меток времени unix. Пример значения: 1573917475. Мне нужно сохранить это значение в формате ISO в Mongoose. Пример: 2019-11-16T15:17:55 Я знаком с тем, как преобразовать это значение в значение даты и времени в формате ISO/UTC с помощью Javascript или MomentJS. Однако я хотел бы установить это поведение в схеме Mongoose, если это возможно.

Ответ API, содержащий значения отметки времени:

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

Схема мангуста:

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

В настоящее время это сохраняет даты в 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 работает за миллисекунды. Вы должны умножить это значение метки времени на 1000.   -  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