Пн goose схема необязательно с проверкой - PullRequest
0 голосов
/ 12 марта 2020

При наличии такой схемы:

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

someString не является обязательным, но имеет проверку для проверки, если его длина меньше 400.

Если мне задана недопустимая длина string (> 400) будет ли этот объект сохранен, но без someString или это вызовет ошибку? Если это приводит к ошибке, как я могу изменить схему, чтобы объект все еще сохранялся?

1 Ответ

1 голос
/ 12 марта 2020

Будет выдано сообщение об ошибке без сохранения документа.

Допустим, у нас есть эта схема:

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");
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...