Почему этот документ MongoDB создается с помощью одного и того же наноида?

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