как разрешить значение null для поля enum в схеме mongoose?

#node.js #mongodb #typescript #mongoose #enums

#node.js #mongodb #typescript #mongoose #перечисления

Вопрос:

Я пытаюсь создать новый объект в MongoDB с помощью mongoose.

Вот моя схема mongoose:

 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: 'some@email.com',
}).exec()
  

Возникает следующая ошибка:

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

Я смог исправить это, установив:

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

Но мне было интересно, есть ли лучший или более правильный способ сделать это, поскольку мое решение кажется немного хакерским, и я ожидаю, что если я установлю значение по умолчанию равным null, валидатор разрешит это значение равным null.

Комментарии:

1. Разве вы не можете включить null в качестве значения в SomeEnumObj ? —> SomeEnumObj = { TEST: "TEST", _null: null }

2. мммм, я думал об этом. но я использую перечисления также в качестве валидаторов, поэтому при редактировании пользователя someKey не будет разрешено иметь значение null … я просто понял, что это довольно плохая практика, поэтому я просто добавлю значение null к значению enum / disallow, чтобы оно было nullable…

Ответ №1:

Основываясь на этой проблеме, я также не нашел правильного решения, поскольку это тоже моя проблема. Я считаю, что нет необходимости добавлять null в качестве значения по умолчанию (default: null) для устранения проблемы.

Просто добавьте это в свою схему:

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

Ваша схема :

 ...

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

...
  

Комментарии:

1. у меня это не сработало, просто nullable:true мне пришлось добавить .concat([null]),

2. nullable: true бесполезно

Ответ №2:

Использование undefined вместо null сработало для меня:

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