1

我想验证用户的电子邮件地址,但仅限于更改时。每次我保存到 anyEntrant时,以下代码似乎都会出现错误,因此在保存自身时会抛出一个错误,即电子邮件是重复的。

如何在创建参赛者而不是每次进行编辑和保存时正确验证?

EntrantSchema.pre 'save', (next)->
  user = this  
  # Email Validation
  if (user.isModified('email'))
    console.log "Email has been changed".green.inverse

    # Unique Value
    EntrantSchema.path("email").validate ((email,respond) ->
      Entrant.findOne {email:email}, (err,user) ->
        if user
          respond(false)
        respond(true)
    ), "Oopsies! That e-mail’s already been registered"

请注意,我认为 validate() 是第一次绑定,因为当我更新用户时,我没有收到“电子邮件已更改”,我在控制台登录我的代码

4

1 回答 1

3

您以错误的方式使用验证。Mongoose 将验证器附加到模式而不是单个文档,这使它们成为全局的。

因此,pre 'save'您应该定义一个好的电子邮件验证器,而不是验证电子邮件:

EntrantSchema.path('email').validate ((email,respond) ->
  return respond true unless @isModified 'email'
  Entrant.count {email}, (err, count) ->
    respond count is 0
), "Oopsies! That e-mail’s already been registered"

但是,如果您希望电子邮件是唯一的,那么最好使用unique索引:

EntrantSchema = new mongoose.Schema
  email: type: String, unique: true

检查验证器中的唯一值可以使用相同的电子邮件更新两个用户。

顺便说一句,钩子(prepost将被删除Mongoose 4.0

于 2013-08-05T17:01:26.320 回答