创建一个不需要的Mongoose模式,类型为string,带有枚举和默认值null?

zaqlnxep  于 2023-05-23  发布在  Go
关注(0)|答案(1)|浏览(148)

是否可以设置满足以下要求的mongoose模式:
1.必填
1.类型为“string”type: String
1.有一个枚举enum: ['red', 'green']
1.默认设置为nulldefault: null

0aydgbwb

0aydgbwb1#

所以,我想办法弄明白了。当我读了更多的书,明白了当你定义不同的东西时会发生什么时,这就变得清晰了。

Goal:我希望有一个mongoose schema属性,该属性为nullstring。如果它是一个string,我想验证和检查该值是否严格等于给定数组中的一个值。

color: {
  type: String,
  enum: ['red', 'green'],
  default: null
}

这是行不通的有两种情况:
1.如果传入对象上的color属性 exists,那么它的值会被enum验证器验证,一切正常。
1.如果color属性 * 在传入对象上不存在 *,我想将null保存为color的值。在本例中,传入的属性colorundefined,因此无论我们为default定义了什么,都将被作为要为color设置的值,就像在第一个场景中一样,它将被enum验证器验证。显然,如果使用null,将导致错误。为了避免这种情况,我将enum验证器替换为自定义验证器。

color: {
  type: String,
  validate: (value: string | null) => {
    if (value === null) return true;
    
    return ['red', 'green'].includes(value); // you could use enum here
    // return Object.values(MyEnum).includes(value as MyEnum);
  },
  default: null
}

我们的自定义验证器将 * 总是 * 运行,因为根据Mongoose的文档,验证器不会在未定义的值上运行,我们在任何情况下都不会有。

**注意:**Mongoose规则的唯一例外是required验证器,它会保证当其他验证器运行时,color * 不会是 * undefined。但那不是我的案子。我希望color是可选的。我的理由是,我不希望前端确保在业务逻辑不需要时发送它。

相关问题