首页 > 解决方案 > Mongoose 模式可选,带验证

问题描述

给定这样的架构:

new Schema(
    {
      someData: {
        someString: {
          required: false,
          maxlength: 400,
          type: String
        }
        otherData: {
          required: true,
          type: String
        }
});

someString是可选的,但有一个验证来检查它的长度是否低于 400。

如果给我一个无效的长度字符串(> 400),这个对象是否仍会被保存但没有,someString或者这会引发错误吗?如果这引发错误,我该如何更改架构以使对象仍被保存?

标签: mongodbvalidationmongoose

解决方案


它会在不保存文档的情况下引发错误。

假设我们有这个模式:

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const studentSchema = new Schema({
  someData: {
    someString: {
      required: false,
      maxlength: 5,
      type: String
    },
    otherData: {
      required: true,
      type: String
    }
  }
});

module.exports = mongoose.model("Student", studentSchema);

而这个帖子路线:

const Student = require("../models/student");

router.post("/students", async (req, res) => {
  try {
    const result = await Student.create(req.body);
    res.send(result);
  } catch (err) {
    console.log(err);

    if (err.name === "ValidationError") {
      return res.status(400).send(err.errors);
    }
    res.status(500).send("Something went wrong");
  }
});

当我们发送一个错误的请求时,它会给出 ValidationError ,我们可以从中读取错误详细信息err.errors

请求正文:

{
  "someData": {
    "someString": "123456",
    "otherData": "other"
  }
}

响应将是:

{
    "someData.someString": {
        "message": "Path `someData.someString` (`123456`) is longer than the maximum allowed length (5).",
        "name": "ValidatorError",
        "properties": {
            "message": "Path `someData.someString` (`123456`) is longer than the maximum allowed length (5).",
            "type": "maxlength",
            "maxlength": 5,
            "path": "someData.someString",
            "value": "123456"
        },
        "kind": "maxlength",
        "path": "someData.someString",
        "value": "123456"
    }
}

您可以通过删除该选项来解决此问题maxlength,或者检查路由中字段的长度,如果它的长度大于指定的最大长度,您可以对其进行 substr,以免导致错误。

router.post("/students", async (req, res) => {
  try {
    let doc = req.body;

    if (doc.someData && doc.someData.someString && doc.someData.someString.length > 5) {
      doc.someData.someString = doc.someData.someString.substring(0, 5);
    }

    const result = await Student.create(doc);
    res.send(result);
  } catch (err) {
    console.log(err);

    if (err.name === "ValidationError") {
      return res.status(400).send(err.errors);
    }
    res.status(500).send("Something went wrong");
  }
});

推荐阅读