【问题标题】:Javascript MongoDB create another unique id if exists in database如果数据库中存在,Javascript MongoDB 创建另一个唯一 ID
【发布时间】:2021-03-24 10:20:31
【问题描述】:

我正在尝试运行此函数,但它返回未定义。

function generateshortid() {
            const myid = shortid.generate();

            Note.findOne({shortid: myid}, function(err, data) {
                if (data) {
                    const newid = shortid.generate();
                    console.log(data)
                    return newid;
                } else {console.log(myid); return myid;}
            });
        };

【问题讨论】:

    标签: javascript node.js mongodb mongoose unique


    【解决方案1】:

    看起来您正在从回调返回一个值。这行不通。你为什么问?从猫鼬的角度考虑这个问题。当你调用 Note.findOne(condition, callback) 时,你可以想象 Mongoose 会做类似的事情(注意,为了争论,这被过度简化了):

    const result = collection.findOne(condition);
    const note = new Note(result);
    callback(null, note);
    

    它调用提供的回调函数并丢弃结果 - 流控制现在属于您的回调。这是一种称为持续传递样式 (CPS) 的常见模式,Node.js API 从一开始就使用它,尽管现在大多数正在转换为 Promises 和 async/await,这将简化您的代码。

    假设您需要坚持回调,您需要更改函数的签名以接受回调,并将生成的值传递给它,如下所示:

            function generateshortid(callback) {
                const myid = shortid.generate();
    
                Note.findOne({shortid: myid}, function(err, data) {
                    if (data) {
                        const newid = shortid.generate();
                        console.log(data)
                        callback(newid);
                    } else {console.log(myid); callback(myid);}
                });
            };
    

    但是,这个函数存在多个问题(除了最初无法获取返回值之外):

    • 缺乏错误处理
    • 假设第二次尝试将获得唯一 ID 而第一次没有获得唯一 ID 的假设无效

    一般来说,我建议您了解回调与 Promise 和异步/等待,并重新考虑您的唯一 ID 生成策略。最后,MongoDB 的自动_id 字段可能会更好地为您服务。

    【讨论】:

      猜你喜欢
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 2017-07-02
      • 2011-03-14
      • 1970-01-01
      相关资源
      最近更新 更多