javascript - 使用 NodeJS 将 Unix 纪元时间戳保存为 Mongoose Schema 类型日期

标签 javascript node.js mongodb mongoose stripe-payments

我收到来自 Stripe API GET/invoices 端点的响应,该端点将日期作为 unix 时间戳返回。示例值为 1573917475。我需要在 Mongoose 中以 ISO 格式保存此值。示例:2019-11-16T15:17:55 我熟悉如何使用 Javascript 或 MomentJS 将此值转换为 ISO/UTC 格式的日期时间值。但是,如果可能的话,我想在 Mongoose Schema 中设置此行为。

包含时间戳值的 API 响应:

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

Mongoose 模式:

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

这当前正在 Mongo 中保存 as 日期,其值如下:

{
    "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;
}

最佳答案

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)
  }
});

关于javascript - 使用 NodeJS 将 Unix 纪元时间戳保存为 Mongoose Schema 类型日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59379538/

相关文章:

javascript - 如何根据来自 REST 调用的响应形成 json 数组?

node.js - 如何为 AWS Elastic Beanstalk 部署运行 npm 脚本?

php - Laravel mongodb ->getPdo() 返回 null

mongodb - 通过 Mongo TTL 使用 future 日期

node.js - 使用 mongoose hook 重试保存重复键错误

mongodb - 如何在mongodb中找到两个日期之间的时差

javascript - 返回不带方括号的 json 对象

javascript - 单击时覆盖图像居中的图像

javascript - Django:从 View 返回文件后不开始下载

javascript - 如何从外部站点访问和应用 JSON 数据?