【问题标题】:Mongoose unique NanoID猫鼬独特的 NanoID
【发布时间】:2022-07-22 06:04:25
【问题描述】:
const user = new mongoose.Schema(
  {
    nano_id: {
      type: String,
      required: true,
      default: () => nanoid(7),
      index: { unique: true },
    },
...
}

如果不是唯一的,如何再次运行nanoid(7)? (自动运行,控制台不报错)

【问题讨论】:

    标签: node.js mongoose


    【解决方案1】:

    数据库将抛出一个错误,您必须通过新生成的 nanoid 再次生成相同的记录来捕捉并做出反应。

    【讨论】:

      【解决方案2】:

      有两种方法可以做到这一点:

      1. 首先通过搜索具有相似 Nano ID 的文档来防止错误发生,如果文档存在,则使用递归函数重新生成新的 Nano ID。
      const { customAlphabet } = require('nanoid');
      const alphabet = '0123456789abcdefghijklmnopqrstuvwxyz';
      const nanoid = customAlphabet(alphabet, 8);
      
      
      // userRegistration controller or route...
      
        async function uniqueNanoId(query): Promise<string> {
          const nanoId = nanoid();
          const sameNanoId = await User.findOne({ nano_id:nanoId });
          if (sameNanoId) {
            return uniqueNanoId(query);
          }
          return nanoId;
        }
      
        const nanoId = await uniqueNanoId();
        const user = User.create({...userBody,nanoId});
      
      //...
      
      1. 捕捉错误 - 正如@cachius 所暗示的那样 - 并相应地重新生成唯一的 Nano ID(未经测试)。已经讨论了捕获重复键here

      2. 奖励:问自己一个问题,我真的需要默认 Mongoose ID 和 Nano ID 吗?如果没有,那么this 是一个简单的解决方案。

      // ...
      _id: {
          type: String,
          default: () => nanoid(),
        },
      // ...
      

      【讨论】:

        猜你喜欢
        • 2018-09-30
        • 2014-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-07
        • 2015-02-05
        相关资源
        最近更新 更多