我正在用Express Mongo设计一个应用程序 . 我想知道是否有猫鼬的任何同步验证功能?

认为这样的场景,我正在用我的自定义验证语句检查现有的电子邮件路径;

UserSchema.path('email').validate(function (email, fn) {
    const User = mongoose.model('User');
    if (this.isNew || this.isModified('email')) {
      User.find({ email: email }).exec(function (err, users) {
        fn(!err && users.length === 0);
      });
    } else fn(true);
  }, 'Email already exists');

关于猫鼬的文件,

验证是异步递归的;当您调用Model#save时,也会执行子文档验证 . 如果发生错误,您的Model#save回调会收到它

电子邮件检查的验证当然必须是同步的 . 如果不是,它将导致严重的不合适 . 如果两个用户同时使用同一个电子邮件请求,则mongoose将接受其中两个 .

在模型的模型字段定义上设置 unique 是否解决了问题?

我问这个是因为在我的应用程序中有一个匹配的系统 . 如果条件满足,我匹配两个用户并创建匹配文档,如;

{
    "_id" : ObjectId("5a2b30396aa5a754ccbfe63c"),
    "checkin" : [ 
        ObjectId("5a2b2ff96aa5a754ccbfe639"), 
        ObjectId("5a2b2fea6aa5a754ccbfe638")
    ],
    "user" : [ 
        ObjectId("5a29ece139205a12b5afd47e"), 
        ObjectId("5a29924bf3dc4b8dd881a307")
    ],
    "createdAt" : ISODate("2017-12-09T00:37:13.221Z"),
    "__v" : 0
}

构建具有相同用户的 match 实体是非常危险的 . 为了控制复制,首先存在匹配实体,如果不存在则构建匹配实体并将其保存到集合中 .

但昨天我发现了一个错误,当两个客户端同时请求时,操作表现为异步并构造文件的副本 .

请告诉我如何处理这个问题 . 我知道使用 findAndUpdate 将匹配关系文档建模到用户's document as a sub document is solves problem. Because then i' m中,并且我确定单个文档上的mongoDB更新是 atomic .

谢谢你的考虑,