#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,
}