【问题标题】:Mongoose saves without a required field没有必填字段的 Mongoose 保存
【发布时间】:2018-10-10 03:57:17
【问题描述】:

我正在尝试通过插入一个未包含在某些必填字段中的对象来测试 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 会忽略架构中的必填字段?

【问题讨论】:

    标签: node.js mongodb mongoose objectid


    【解决方案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 是必需的。

    【讨论】:

    • 太棒了!作品!只有在这种情况下我才应该这样指定?
    • 是的,仅适用于数组
    • 但我还有另一个问题:如果用户发送空白数组,它也会让它被保存 - 无需添加级别、标题和模块。
    • 所以也许你可以修改你的permissionsLimi函数并检查数组是否不为空?
    • 好的,我做到了。但是如果我已经说过我想要级别,标题和模块,我为什么还要这样做呢?需要哪个级别?
    猜你喜欢
    • 1970-01-01
    • 2013-11-14
    • 2019-01-01
    • 1970-01-01
    • 2014-11-23
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多