【问题标题】:Mongoose, MongoError handlingMongoose, MongoError 处理
【发布时间】:2014-09-08 01:41:43
【问题描述】:

我正在创建一个使用 Mongoose 与 MongoDb 交互的简单应用程序,独特的验证错误处理一直困扰着我。

UserSchema = new Schema({
                        email: {type:String, required: true, unique: true, trim: true, match: [emailRegex, 'Email format is invalid']},
                        hashedPassword: {type: String, default: ''},
                        salt: {type: String, required: true, unique:true}

                    }
);

在上面的架构中,我有unique :true 用于电子邮件,当输入具有重复电子邮件地址的新文档时,我收到的错误是:

{ [MongoError: insertDocument :: caused by :: 11000 E11000 duplic
ndex: testdb.users.$email_1  dup key: { : "minhs22sa22f@gmail.com
  name: 'MongoError',
  code: 11000,
  err: 'insertDocument :: caused by :: 11000 E11000 duplicate key
estdb.users.$email_1  dup key: { : "minhs22sa22f@gmail.com" }' }

上面的错误对象需要相当多的努力才能从它们中提取信息以显示回客户端,所以我的问题是:有没有办法让它使用 validationError 来代替,这些更直观、更简单?

我也考虑过使用自定义路径验证,但如果可能,最好使用内置功能。

【问题讨论】:

  • 我现在正在了解您的确切情况。似乎最好的选择是将正则表达式应用于 err 字段。换句话说,@wdberkeley 是有道理的。看来重复键的错误码是常数,应该很难从索引名中提取键(字段)。

标签: node.js mongodb error-handling mongoose


【解决方案1】:

不是真的。该错误是电子邮件字段上的唯一键违规,由 MongoDB 发出。为了使其成为验证错误,验证函数必须自己发现唯一密钥违规。在验证函数中,基本上有两种方式发生这种情况:

  1. 查询MongoDB,得到上述错误,解析成validationError
  2. 记住所有emails,以便您自己检查唯一的密钥违规情况

第一种方法只是将解析推送到验证函数中,并使用额外的 MongoDB 查询而没有任何收获。第二个没有意义。

编写一个函数,将错误解析为您需要的任何有用的形式。它只需要编写和测试一次。

【讨论】:

    【解决方案2】:

    我发现的另一种可能性是使用 mom 模块,将重复键错误转换为类似的验证。

    这个叫mongoose-unique-validator

    我没有阅读代码,但我的猜测是它只是解析错误以便重新格式化它。

    另外,我会看看性能,它很有可能会影响它。

    【讨论】:

      猜你喜欢
      • 2020-05-05
      • 2021-01-06
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      • 2018-08-21
      • 2020-10-03
      • 2012-08-05
      相关资源
      最近更新 更多