Мангуст спасает без обязательного поля - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь протестировать схемы Mongoose, вставив объект, который не входит в какое-либо обязательное поле.

Это так:

let schema = {
    _supplier: {
      type: Schema.Types.ObjectId,
      required: true
    },
    permissions: {
      type: [
        {
          level: {
            type: Number,
            min: 1,
            max: 9,
            required: true
          },
          title: {
            type: String,
            minlength: 0,
            maxlength: 16
          },
          modules: [String]
        }
      ],
      validate: [permissionsLimit, '${PATH} exceeds the limit of 9'],
      required: true
    }
  };

  function permissionsLimit(v) {
    return v.length<=9;
  }

  let permissionsTestSchema = new Schema(schema);

  let PermissionsTest = mongoose.model("permissionsTestSchema", permissionsTestSchema);

  let permissionTest = new PermissionsTest({
    _supplier: mongoose.Types.ObjectId()
  });

  permissionTest.save(err => {
    if (err) return cast.error(err);
    return cast.ok();
  });

Как видите, я делаюэкземпляр, который содержит только ключ _supplier - я не добавляю массив permissions - Что требуется .

Вместо получения ошибки Mongoose применяет действие ивставляет пустой массив permissions в коллекцию в MongoDB.

Здесь мне не нужно такое поведение.Я не отправляю документ в коллекции, в котором отсутствуют детали.

Если пользователь не предоставляет массив permissions для своего значения, я вообще не принимаю запрос.

Почему Mongoose игнорирует обязательные поля в схеме?

1 Ответ

0 голосов
/ 09 октября 2018

Массивы в mongoose имеют одну особенность:

Массивы являются особыми, потому что у них неявно есть значение по умолчанию [] (пустой массив).

Чтобы перезаписать это значение по умолчанию, вам нужно установить значение по умолчанию, равное undefined

Таким образом, вы можете изменить свою схему на:

let schema = {
    _supplier: {
        type: mongoose.Schema.Types.ObjectId,
        required: true
    },
    permissions: {
        type: [
            {
                level: {
                    type: Number,
                    min: 1,
                    max: 9,
                    required: true
                },
                title: {
                    type: String,
                    minlength: 0,
                    maxlength: 16
                },
                modules: [String]
            }   
        ],
    validate: [permissionsLimit, '${PATH} exceeds the limit of 9'],
    required: true,
    default: undefined
    }
};

, и тогда ваш код выдаст исключение со следующимисообщение:

UnhandledPromiseRejectionWarning: ValidationError: сбой проверки permissionsTestSchema: permissions: Path permissions требуется.

...