【问题标题】:Better ways to handle MongoDB exceptions处理 MongoDB 异常的更好方法
【发布时间】:2011-05-09 16:24:49
【问题描述】:

我正在为我的 asp.net 应用程序开发一个支持 MongoDB 的身份验证模块。 MongoDB 数据库有一组用户,我在其中存储登录信息 - 用户名、电子邮件和密码。用户名和电子邮件都设置为唯一:

users.ensureIndex({email:1}, {unique:1})
users.ensureIndex({uname:1}, {unique:1})

现在,如果我尝试使用现有的 uname 或电子邮件插入记录,我会收到 MongoDB 异常:

Safemode detected an error: E11000 duplicate key error index: 
authdb.users.$email_1  dup key: { : "test@test.com" } 
(response: { "err" : "E11000 duplicate key error index: authdb.users.$email_1  
dup key: { : \"test@test.com\" }", "code" : 11000, "n" : 0, "connectionId" : 9, 
"ok" : 1.0 })

我需要告诉用户他们输入的用户名或电子邮件已经存在,但整个异常只是一个文本块,要查看发生了什么我必须通过查看“$email”还是“$”来猜测uname”在错误消息文本中。是否有某种 MongoDB 异常解析器可以帮助我检测异常的用途?

【问题讨论】:

    标签: mongodb mongodb-.net-driver


    【解决方案1】:

    我在 MongoDB 的错误跟踪器中创建了一个功能请求,以在重复键错误的 getLastError 输出中添加额外字段。请在https://jira.mongodb.org/browse/SERVER-3069投票。

    在实现之前,对于您的用例,您只需检查 err 字符串是否包含“email”或“uname”,并从您刚刚尝试插入的文档中检索重复值。它没有它应该的那么优雅,但它现在应该可以工作了。

    【讨论】:

      【解决方案2】:

      使用 c# MongoDB 驱动程序 1.x 可以像这样检测重复项

      try
      {
          collection.Insert(doc);
      }
      catch (MongoWriteConcernException ex)
      {
          if (ex.Code == 11000)
              throw new YourConflictException("User already exists for username and/or email");
          else
              throw ex;
      }
      

      使用 c# MongoDB 驱动程序 2.x 见 https://stackoverflow.com/a/30309874/516748

      但如果您想确切知道解析文本可能需要哪个重复键

      【讨论】:

      • try catch 在这里被认为是好的做法吗?如果我们有 try catch,我们应该避免使用异步插入吗?
      猜你喜欢
      • 2020-11-17
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      相关资源
      最近更新 更多