猫鼬保存没有必填字段

时间:2018-10-09 19:32:20

标签: node.js mongodb mongoose objectid

我试图通过插入未包含在某些必填字段中的对象来测试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数组-需要哪个

猫鼬没有收到错误,而是应用了该操作并将permissions的空白数组插入MongoDB中的集合。

这不是我在这里需要的行为。 我不会在集合中查看丢失细节的文档。

如果用户没有为其值提供permissions数组,那么我根本不接受查询。

为什么猫鼬会忽略模式中的必填字段?

1 个答案:

答案 0 :(得分:1)

猫鼬中的

Arrays具有一项特殊功能:

  

数组是特殊的,因为它们隐式具有默认值[](空数组)。

     

要覆盖此默认值,您需要将默认值设置为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:路径permissions是必需的。