【问题标题】:How to verify that the timestamp send is in UTC in mongoose/Hapijs?如何在猫鼬/Hapijs 中验证时间戳发送是否为 UTC?
【发布时间】:2015-08-29 20:10:02
【问题描述】:

我正在使用 Hapi 在 node.js 中构建应用程序,并使用 Mongoose 在 Mongodb 中构建数据库。我有以下消息架构:

var schema = {
    from : {
        type : Schema.ObjectId,
        ref : 'User'
    },
    content : {
        type : String,
        required : true
    },
    group : {
        type : Schema.ObjectId,
        ref : 'Group'
    },
    created : {
        type : Number,
        default : Date.now()
    }
};

我希望架构中的 created 字段是时间戳,并且始终使用 UTC。为此,我的客户端始终将其当前时间戳转换为其 UTC 时间戳,然后发送到服务器。但是,我在服务器上找不到可能的方法来验证提供的时间戳是否已转换为 UTC。有什么方法可以在 Hapi/Mongoose 中进行验证?

提前致谢。

编辑

  1. created 字段的类型更改为Number,因为我想存储timestamp 而不是日期字符串。

【问题讨论】:

  • 我敢说这取决于客户如何提交您的日期。很有可能(和良好的做法)它是一个“字符串”。所以你可以这样做:"2015-06-14T06:26:30.510Z".substr(-1) == "Z" 因为如果字符串是 UTC 格式,“Z”将是最后一个字符。另请注意,mongoose 中的验证挂钩会在模式进行的任何“类型”转换“之后”触发。因此,一旦您提交写入操作,任何有效的日期字符串都会被转换,无论它是否是 UTC。
  • 如果我将“创建”字段的类型更改为只是一个数字,然后将其存储为从客户端发送的(作为时间戳)怎么办?很抱歉,我应该早先声明,我现在意识到将字段存储为“日期”类型将始终将其转换为日期字符串而不是“时间戳”数字,这正是我想要的。我会在几分钟内更新问题中的“创建”类型。
  • 首先我建议保留“日期”类型,因为 MongoDB 可以很好地原生地处理日期,甚至还有一些技巧可以将该类型用作“时间戳”(这基本上是内部存储)所以改变它没有真正的优势和劣势。其次,如果它是作为时间戳的“数字”格式,那么无论如何它将是 UTC,因为 Unix 时间戳不记录“时区”信息。

标签: javascript node.js mongodb mongoose hapijs


【解决方案1】:

Hapi 允许您在每条路由上都有一个validate 属性。在后台,它使用 Joi 来验证此属性中提供的架构到有效负载、参数、查询字符串和标头:Route Configuration

使用它,您可以验证您的 created 字段是否为特定日期格式:date.format()

例如,这会将其验证为 ISO 8601 格式:

    validate: {
        payload: {
            created: Joi.date().iso();
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 2017-12-08
    • 1970-01-01
    • 2019-06-14
    • 2021-06-20
    • 2017-01-07
    • 2016-09-23
    • 1970-01-01
    相关资源
    最近更新 更多