如何允许猫鼬模式中的枚举字段可为空?

问题描述 投票:0回答:2

我正在尝试使用 mongoose 在 MongoDB 中创建一个新对象。

这是我的猫鼬模式:

const UsersSchema = new Schema<BaseUser>(
    {
        email: {
            type: Schema.Types.String,
            index: true,
            required: true,
            unique: true,
        },
        someKey: {
            type: Schema.Types.String,
            default: null,
            required: false,
            enum: Object.values(SomeEnumObj),
        }
    },
    {
        timestamps: true,
    }
);

enum SomeEnumObj = {
 TEST = "TEST",
}

当我尝试使用以下命令创建新用户时:

model.create({
 email: '[email protected]',
}).exec()

抛出以下错误:

users validation failed: someKey: `null` is not a valid enum value for path `someKey`., 

我可以通过设置解决这个问题:

enum: [...Object.values(SomeEnumObj), null]

但是我想知道是否有更好或更正确的方法来做到这一点,因为我的解决方案感觉有点老套,并且我希望如果我将默认值设置为 null,验证器将允许它为 null。

node.js mongodb typescript mongoose enums
2个回答
8
投票

基于这个问题我也没有找到任何合适的解决方案,因为这也是我的问题。我相信不需要添加 null 作为 默认值

(default: null)
来解决问题。

只需将其添加到您的架构中:

Object.values(SomeEnumObj).concat([null])

您的架构:

...

someKey: {
  type: Schema.Types.String,
  enum: Object.values(SomeEnumObj).concat([null]),
}

...

更新

Mongoose@^8
迁移指南中所述,
null
对于非必需的字符串枚举有效。

const schema = new Schema({
  status: {
    type: String,
    enum: ['on', 'off']
  }
});
const Test = mongoose.model('Test', schema);

// Works fine in Mongoose 8
// Throws a `ValidationError` in Mongoose 7
await Test.create({ status: null });

1
投票

使用

undefined
而不是
null
对我有用:

        someKey: {
            type: String,
            default: undefined,
            required: false,
            enum: SomeEnumObj,
        }

© www.soinside.com 2019 - 2024. All rights reserved.