【问题标题】:mongoose document treating number / string as a datemongoose 文档将数字/字符串视为日期
【发布时间】:2018-04-18 01:06:57
【问题描述】:

型号

const hoursSchema = new Schema({
    date: {
        type: Date,
        required: true,
        trim: true,
    },
    location: {
        type: String,
        required: true,
        trim: true,
        minlength: 1,
    }
});

module.exports = mongoose.model('Hours', hoursSchema);

路线

router.post('/', (req, res) => {
   const body = _.pick(req.body, ['date', 'location']);
   const entry = new Hours(body);
   res.send(entry);
   // rest of code...
});

我提出一个发布请求,假设日期:12 / 日期:“12”。 Mongoose 将其视为时间戳,因为我在日期字段中收到此结果 - 1970-01-01T00:00:00.012Z。我怎样才能防止这种情况?当用户以 yyyy-mm-dd 或 dd-mm-yyyy 格式发送除日期以外的其他数据时,我想抛出错误

【问题讨论】:

标签: javascript node.js date express mongoose


【解决方案1】:

最简单的方法是使用 express 中间件函数并在那里检查合法输入。已经有一个名为express-validator 的中间件库可供您使用。它不包含检查合法日期的功能,因此您必须自己制作。

要检查合法日期,您可以使用如下函数(来自here):

function isValidDate(value) {
  if (!value.match(/^\d{4}-\d{2}-\d{2}$/)) return false;

  const date = new Date(value);
  if (!date.getTime()) return false;
  return date.toISOString().slice(0, 10) === value;
}

它需要以下格式:YYYY-MM-DD。您可以将它与 DD-MM-YYYY 的函数结合使用。你可以找到一些例子here

后控制器之前的中间件函数:

const dateValidator = [
  check('date')
   .custom(isValidDate)
   .withMessage('the date is illegal')
]

然后路线将变为:

router.post('/', dateValidator, (req, res) => {}

在控制器函数内部,您将从以下检查开始:

const errors = validationResult(req);
if (!errors.isEmpty()) {
  return res.status(422).json({ errors: errors.mapped() });
}

如果日期不合法,用户将收到一条错误消息。

【讨论】:

  • 感谢您的回答。我需要检查这个 express-validator 并使用它。所以没有可能在猫鼬模型中进行这种验证吗?为什么猫鼬会进行这种转换?
  • 您也可以在 mongoose 中进行自定义验证。 Here 是有关此的一些信息。我会假设“12”是一种合法的日期格式,这就是它被允许的原因。
  • 实际上,当我想到它时,日期验证在 Mongoose 中并不能很好地工作。 Here 是关于该问题的问题。在验证触发之前,您将收到一个 casterror。因此,您不妨使用中间件方法。
  • 感谢@MikaS 的帮助。我决定使用这个 express-validator 来验证日期。那么现在我应该将所有验证案例(对于其他领域)移动到表达路线以保持应用程序的组织吗?你怎么看?
  • @randomGuyFromTheInternet 是的,我会这样做。对于像数字和字符串这样的简单事物,您还可以让 mongoose 和 express-validator 验证它们。首先是 express-validator,如果失败(它不应该)它会被猫鼬捕获。然后,您将有几个防御障碍。但这取决于你。有几个 questions 已经在最好的地方处理验证。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 2013-12-27
相关资源
最近更新 更多