node.js - 使用 mongoose hook 重试保存重复键错误

标签 node.js mongodb mongoose mongoose-plugins

我想使用 mongoose 中间件 Hook 重新尝试保存文档,以防初始保存因重复键错误而失败。用例如下:

我的模型使用自动生成的 slug 进行识别。例如。 item, item-2, item-3, …, item-n.如果 item 已经存在,则应向 slug 添加一个计数器。我无法提前检查“下一个”slug,因为我需要在任何情况下避免冲突。

由于这个逻辑会涉及到几个不同的模型,所以我想把它隔离成一个mongoose插件。

这个想法是否可行?例如。 schema.post('save', handler) 仅在成功保存时执行。还有其他我可以利用的钩子(Hook)吗?

最佳答案

我正在使用预保存 Hook 来检查 slug 是否已经存在并使用以下代码,到目前为止它似乎工作得很好。

pageSchema.pre('save', function(next){
    var page = this;

    page.createdDT = new Date();
    page.updatedDT = new Date();

    page.slug = page.title.slug(); // create slug from title

    var re = new RegExp(page.slug, 'i');

    mongoose.models["page"].find({slug: { $regex: re}}, function(err, pages){
        // slug doesn't exist, good to go
        if(!err && !pages) return next();

        var slugs = [];

        // let's get all slugs
        pages.forEach(function(page){
            slugs.push(page.slug);
        });

        // keep increasing `i` until slug is unique
        // set i to 1 to avoid hello-0 
        var i = 1;
        var tempSlug = page.slug;
        while(slugs.indexOf(tempSlug) >= 0){
            tempSlug = page.slug + '-' + i;
            i++;
        }

        //unique slug for example "hello-2"
        page.slug = tempSlug;
        next();
    }); 
});

关于node.js - 使用 mongoose hook 重试保存重复键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33920653/

相关文章:

javascript - SailsJS 阻止不需要的数据进入数据库

node.js - 如果 Upsert 是更新,如何撤消更新;如果 Upsert 是使用 Sequelize 插入,则如何删除

ruby-on-rails - 从 Heroku Rails 应用程序运行 Node

angularjs - 当我将数据保存到 mongoDB 时,如何在我的代码中获取 _id 值

node.js - MongoDB 如何检查数组中的所有ObjectId是否存在于数据库中?

node.js - Nodejs ws模块: Heartbeat in TypeScript

javascript - 如何处理在 Mongodb 中存储为字符串的日期?

node.js - mongo 检查点是否在存储的多边形内

mongodb - 在 mongoDB 中使用 firebase Auth uid 作为用户文档 _id

javascript - Node JS Inspect 显示属性具有值,但检查属性返回未定义