【发布时间】:2016-07-26 15:36:53
【问题描述】:
我正在为我的项目中的某些模型实施slug,我希望保持它的唯一性并基于文档的数据。
var user = new User({ name: { first: 'John', last: 'Doe' });
user.save().then(function(user) {}); // user.slug === 'john-doe'
var user2 = new User({ name: { first: 'John', last: 'Doe' });
user2.save().then(function(user) {}); // user.slug === 'john-doe-2'
我可以成功实现它,我什至可以在.pre('save')钩子上查询数据库,像这样:
UserSchema.pre('save', function(next) {
var user = this;
return User.distinct('slug')
.exec()
.then(function(slugs) {
// generate a unique slug like "john-doe-2",
// checking it against slugs that are already
// in the database, and set it to user
next();
});
});
唯一的问题是并发请求(不太可能,但仍有可能):
var user = new User({ name: { first: 'John', last: 'Doe' }),
user2 = new User({ name: { first: 'John', last: 'Doe' });
Promise.all([ user.save(), user2.save() ]);
// throws validation error if slug should be unique
为此,我正在寻找一种解决方案来处理验证错误(唯一索引重复)并尝试使用更新的参数(如“john-doe-2”)重新保存文档。
【问题讨论】:
-
在保存中处理此错误可能会有问题。您已经离开了 presave 处理程序。您可以创建另一个集合“users-slug”并尝试将 slug 插入到那里(slug 字段也应该是唯一的)。您可以在预保存中执行此操作。如果你在那里失败了,你可以改变 slug 并重试。
标签: node.js mongodb concurrency mongoose slug