MongoError:带护照的E11000重复密钥错误集合

时间:2017-07-28 17:12:40

标签: javascript authentication passport.js

我有以下userSchema

var mongoose = require("mongoose"),
passportLocalMongoose = require("passport-local-mongoose");

var userSchema = new mongoose.Schema({
email: String,
password: String,
userName: String,
fname: String,
lname: String,
userType: Number,
subscribedThreads: [
    {
        type: mongoose.Schema.Types.ObjectId,
        ref: "Threads"
    }
]
});
// add passport methods
userSchema.plugin(passportLocalMongoose);
// export modules to be used by the file requiring it
module.exports = mongoose.model("Users",userSchema);

收集的第一个条目应该发生,但接下来的条目会给出

{ [MongoError: E11000 duplicate key error collection: KManV3.users 
index: username_1 dup key: { : null }]
name: 'MongoError',
message: 'E11000 duplicate key error collection: KManV3.users index: 
username_1 dup key: { : null }',
driver: true,
code: 11000,
index: 0,
errmsg: 'E11000 duplicate key error collection: KManV3.users index: 
username_1 dup key: { : null }',
getOperation: [Function],
toJSON: [Function],
toString: [Function] 
}

此外, dbname.users.getIndexes()给出:

> db.users.getIndexes()
[
{
    "v" : 1,
    "key" : {
        "_id" : 1
    },
    "name" : "_id_",
    "ns" : "KManV3.users"
},
{
    "v" : 1,
    "key" : {
        "password" : 1
    },
    "name" : "password_1",
    "ns" : "KManV3.users",
    "background" : true
},
{
    "v" : 1,
    "unique" : true,
    "key" : {
        "username" : 1
    },
    "name" : "username_1",
    "ns" : "KManV3.users",
    "background" : true
}
]

显然,架构的每个属性都设置为唯一,即使数据完全不同,我也无法将数据添加到集合中。我不确定是否归因于护照的整合。

2 个答案:

答案 0 :(得分:2)

查看passport-local-mongoose的{​​{3}}:

  

usernameField:指定保存用户名的字段名称。默认为'用户名'。

     

usernameUnique:指定是否应通过mongodb索引强制使用username字段作为唯一。默认为true。

这解释了为什么您的集合在(不存在于您的架构中)username字段中具有唯一索引的原因。

如果您没有在添加到数据库的文档中实际设置此字段,MongoDB将使用null,并在插入第一个文档后,使用后续文档(也包含字段值) null的{​​{1}}会抛出E11000错误。

首先,删除username上的索引(以及username,我假设您曾在该架构中将该字段标记为password),并为{设置正确的字段名称{1}}使用:

unique

(或passport-local-mongoose,如果您希望该字段用作唯一用户标识符)

答案 1 :(得分:0)

错误原因-您试图在其中插入的集合中没有索引。 解决方案-删除该集合,然后再次运行程序。