【问题标题】:Generate Alternative when Unique Index fails on MongoDB当唯一索引在 MongoDB 上失败时生成替代
【发布时间】:2023-04-06 16:17:01
【问题描述】:

因此,当用户通过 Google、Twitter 等进行注册时,名称可能会重叠。在我的应用程序中,用户名具有唯一索引。由于每当有人第一次登录时都会将新文档放入集合中,因此有时唯一索引会失败。注册用户的代码如下:

module.exports.findOrCreateUser = (provider, id, data, done) ->
    User.findByAuth provider, id, (err, user) ->
        if err? then done err
        else if user? then done null, user
        else
            user = new User
                auth: [{id: id, provider: provider}]
                name: data.name
                email: data.email
            user.save (err) ->
                if err? then done err else done null, user

所以我这里有两个问题:

  1. 如何检查err 是否为唯一索引错误?
  2. 向用户名附加唯一后缀的最有效方法是什么?

【问题讨论】:

  • 如何通过用户登录的服务为其添加前缀/后缀。例如 google_username、twitter_username、facebook_username、...
  • 对于 Q(1),我确信 err 应该包含错误代码以及类似“重复键错误索引”之类的描述性消息。您应该记录一次err,以了解这一点。
  • @innoSPG:这是个好主意。我从来没想过这点。虽然我想避免显示他们用来登录的服务......
  • @AbhishekKumar 不幸的是,我无法找到有关node-mongodb-native 错误格式/代码的任何文档,也许你有什么?
  • 我猜这段代码是在服务器端执行的。另外,我建议您记录一次错误以了解实际错误。在 mongo shell 中,您会收到此错误 E11000 duplicate key error index: test.test2.$a_1 dup key: { : 1.0 }

标签: node.js mongodb oauth coffeescript


【解决方案1】:
  1. err 对象有一个 message 属性,该属性与 mongo shell 给出的错误消息相匹配。检查是否存在唯一索引错误应该如下所示:

    if (err && err.message.indexOf('E11000 ') !== -1) {
        // this _id was already inserted in the database
    }
    
  2. 我同意 @innoSPG 将服务名称附加到用户名。如果您不想指示与用户名关联的服务,只需在用户名后附加一个计数器并在每次使用时递增。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    相关资源
    最近更新 更多