#javascript #mongodb #mongoose
Вопрос:
Для начала я уже нашел исправление, но мне нужно знать, почему произошла ошибка. В следующих двух примерах MongoDB документы создаются с одинаковым идентификатором и датой соответственно.
id: {
type: String,
required: true,
unique: true,
default: nanoid(),
immutable: true,
},
dateCreated: {
type: Number,
required: true,
default: Date.now(),
immutable: true,
}
В следующих двух примерах каждый документ создается с другим идентификатором и датой создания
id: {
type: String,
required: true,
unique: true,
default: () => nanoid(),
immutable: true,
},
dateCreated: {
type: Number,
required: true,
default: () => Date.now(),
immutable: true,
}
Я знаю, что это как-то связано со значением и ссылкой в javascript, но я не могу точно определить, почему это происходит.
Ответ №1:
Когда вы передаете это в объект:
default: nanoid(),
интерпретатор javascript сначала выполнит nanoid()
и присвоит возвращаемое значение default
полю.
По сути, это было бы то же самое, что:
const newId = nanoid();
...
id: {
type: String,
required: true,
unique: true,
default: newId
immutable: true,
},
Это фактически устанавливает статическое значение по умолчанию.
Обратите внимание , что вы, вероятно, могли бы получить желаемое поведение, не включая ()
, например
id: {
type: String,
required: true,
unique: true,
default: nanoid,
immutable: true,
},