【问题标题】:Time format in mongoose scheema Object猫鼬模式对象中的时间格式
【发布时间】:2019-10-18 05:14:45
【问题描述】:

我有如下模式对象

 schedule: [{
        time: {
            type: Date,
            required: true
        }
    }]

当我尝试在邮递员中发布数据时

"schedule":[
      {
         "time":"18:00:00"
      }]

我收到以下错误

验证失败:schedule.1.time:Cast to Date 值“12:00:00”失败

如果我将 type 定义为 String,则一切正常。

我认为我在定义接受时间的类型时是错误的。任何人都可以帮助我更好地定义对象类型

【问题讨论】:

    标签: node.js mongoose mongoose-schema


    【解决方案1】:

    可以创建自定义类型和存储时间。但我建议您将时间存储为字符串。在这种情况下,字符串很容易解析、维护和检索。

    像这样添加自定义验证。

    time: {
        type: String,
        validate: {
          isAsync: true,
          validator: function(v, cb) {
            setTimeout(function() {
              var timeRegex = /^(?:2[0-3]|[01][0-9]):[0-5][0-9]:[0-5][0-9]$/;
              var msg = v + ' is not a valid time format!';
    
              cb(timeRegex.test(v), msg);
            }, 5);
          },
    
          message: 'Default error message'
        },
        required: [true, 'Time is required']
      }
    

    【讨论】:

    • 这个问题跑题了,但我想问一下你为什么在验证器中使用isAsync: true
    • 我从我的代码库中粘贴了这个 sn-p。你不需要 async 或那里的 setTimeOut 。使用异步是因为在验证器中使用了 setTimeOut。
    【解决方案2】:

    查看它所传达的信息

    时间:Cast to Date 值失败

    时间和日期是不同的东西

    如果您需要使用以下作品的时间

    { 
        "time":"2019-06-12T13:34:00.000"
    }
    

    【讨论】:

      【解决方案3】:

      我有一个简单的问题要问你,你想只存储 时间(没有日期组件,例如 18:00:00)还是作为 时间戳(日期和时间,例如2019-06-11T06:24:46.642Z)?

      如果只是时间,那么很遗憾,您不能将其存储在 date 类型字段中,因为它接受日期或时间戳,而 string 类型可以接受任意字符串。

      我建议将18:00:00 存储为string,然后在检索后以您想要的任何方式进行处理,或者存储timestamp,字段类型为date,并将其与相应的日期一起使用。

      只是为了解释错误,它发生是因为 18:00:00 不是表示日期的有效方式,因为该字段是日期类型的。

      【讨论】:

        【解决方案4】:

        如您所见,您定义的字段类型与您要在其中存储的数据不匹配。如果将其定义为类型:日期,它将只接受有效日期,而“18:00:00”则不接受。

        据我了解你想要做的,我认为最好的选择可能是存储一个有效的日期对象,即使你只打算在你的代码中显示或编辑客户端的时间。

        另一种可能性是在模型中声明三个数字字段:小时、分钟和秒。

        编辑:

        要按您的要求存储时间,模型可能如下所示:

        schedule: [{
            hours: {
                type: Number, required: true, min: 0, max: 23
            },
            minutes: {
                type: Number, required: true, min: 0, max: 59
            },
            seconds: {
                type: Number, required: true, min: 0, max: 59
            }
        }]
        

        我不知道你将如何处理这些数据,但你可以得到一个字符串,就像你尝试使用这样的函数存储的字符串:

        function timeToString(h, m, s) {
            if (h < 10) h = '0' + h;
            if (m < 10) h = '0' + h;
            if (s < 10) h = '0' + h;
            return h + ':' + m + ':' + s;
        }
        

        【讨论】:

        • 我只想存储时间,然后如何声明小时、分钟和秒。你能给我看一段代码吗
        • 在您编辑的答案中,您提到了小时、分钟和秒作为单个对象。但实际上我在单个对象中寻找的是接受时间
        • 我不知道您在期待什么...我想您不想将其存储为字符串,因为在您的回答中您说它有效,但我知道这不是适合您的解决方案(我也认为不是)。我已经建议了我的想法,但我们谈论的是个人意见,而不是任何类型错误的解决方案,因为原始错误已经修复:该错误是由在日期字段中插入字符串引起的
        猜你喜欢
        • 2021-04-10
        • 2017-01-28
        • 1970-01-01
        • 2019-10-30
        • 2021-09-25
        • 2012-12-26
        • 1970-01-01
        • 2012-02-02
        • 2019-08-21
        相关资源
        最近更新 更多