首页 > 解决方案 > 为什么这个 MongoDB 文档是用相同的 nanoid 生成的?

问题描述

首先,我已经找到了一个修复方法,但我需要知道为什么会出现这个错误。在以下两个 MongoDB 示例中,文档分别使用相同的 id 和 date 生成。

id: {
    type: String,
    required: true,
    unique: true,
    default: nanoid(),
    immutable: true,
  },
dateCreated: {
    type: Number,
    required: true,
    default: Date.now(),
    immutable: true,
  }

在以下两个示例中,每个文档都使用不同的 id 和创建日期生成

id: {
    type: String,
    required: true,
    unique: true,
    default: () => nanoid(),
    immutable: true,
  },
dateCreated: {
    type: Number,
    required: true,
    default: () => Date.now(),
    immutable: true,
  }

我知道这与 javascript 中的值与引用有关,但我无法准确指出它发生的原因。

标签: javascriptmongodbmongoose

解决方案


当您在对象中传递 this 时:

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

推荐阅读