猫鼬模式可选,带有验证

时间:2020-03-12 13:34:12

标签: mongodb validation mongoose

给出这样的模式:

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

someString是可选的,但可以验证其长度是否小于400。

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

1 个答案:

答案 0 :(得分:1)

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

假设我们有以下模式:

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选项来解决此问题,或检查路径中字段的长度,如果该字段的长度大于指定的最大长度,则可以对其进行替换,以免导致错误

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