错误处理:E11000重复键错误收集

时间:2018-07-06 14:02:36

标签: javascript json node.js mongodb express

我在使用Mongoose和MongoDB来在数据库中创建每个配置文件的用户模型时遇到问题。发布一个用户可以正常工作,但是如果我注销并重试,则会引发以下错误:

{
    "name": "MongoError",
    "message": "E11000 duplicate key error collection: CourtAPIDev.users index: trackers.case_id_1 dup key: { : null }",
    "driver": true,
    "index": 0,
    "code": 11000,
    "errmsg": "E11000 duplicate key error collection: CourtAPIDev.users index: trackers.case_id_1 dup key: { : null }"
}

根据猫鼬文档:如果有多个文档(第二个用户)没有索引字段的值或缺少索引字段,则索引构建将失败,并出现重复的键错误。

我不知道如何为trackers属性设置此_id属性–我以为它是自动生成的!

这是我的架构的跟踪器部分。以及相关的case_id属性,该属性似乎抛出了“ null”错误。

enter image description here enter image description here

整个存储库都可以在我的Github上找到,但是我认为可能是我强调的问题点。这是github链接:https://github.com/KingOfCramers/node_login_with_trackers

用户模型:

const UserSchema = new mongoose.Schema({
    email: {
        type: String,
        required: true,
        trim: true,
        minLength: 1,
        unique: true,
        validate: {
            validator: (value) => {
                return validator.isEmail(value);
            },
            message: '{VALUE} is not a valid email'
        }
    },
    password: {
        type: String,
        required: true,
        minlength: 6
    },
    tokens: [{
        access: {
            type: String,
            required: true
        },
        token: {
            type: String,
            required: true
        }
    }],
    trackers: {
        tweets: [TwitterSchema],
        legislation: [LegislationSchema],
        court_cases: [CourtCaseSchema]
    },
    frequency: [EmailSchema]
});

快速路线:

app.post("/users", (req,res) => {
    var body = _.pick(req.body, ['email', 'password']);
    body.frequency = {
        alert_time: new Date(),
        email: req.body.email
    }
    var user = new User(body);

    user.save().then(() => {
        return user.generateAuthToken();
    }).then((token) => {
        res.header("x-auth", token);
        res.send(user);
    }).catch((e) => {
        res.status(400).send(e);
    });
});

测试(摩卡):

 it("Should post a new user", (done) => {
        var email = "uniqueemail@example.com"
        var password = "9webipasd"
        supertest(app)
            .post("/users") // Post request to the /todos URL
            .send({
                email,
                password
            })
            .expect(200)
            .expect((res) => {
                expect(res.headers).toIncludeKey('x-auth')
                expect(res.body._id).toExist();
                expect(res.body.email).toBe(email);
            })
            .end((err) => {
                if(err){
                    return done(err);
                }
                User.findOne({email}).then((user) => {
                    expect(user).toExist();
                    expect(user.password).toNotBe(password);
                    done();
                }).catch((e) => done(e));
            });
    });

3 个答案:

答案 0 :(得分:0)

我的猜测是CourtCaseSchema.case_id上​​有一个不允许重复的索引。

我认为您可以使用CourtAPIDev.court_cases.getIndexes()(在mongo shell中)进行检查(我认为您的数据库名称为CourtAPIDev,集合名称为court_cases,但对此我不确定)。

如果每次运行后都清理测试数据库,那也可以解释为什么测试通过了,因为最多只能有一个用户。

答案 1 :(得分:0)

结果是,这与我的mongodb数据库有关,而不与我的任何代码有关。在网上搜索之后,我发现如果登录mongo shell,然后从users集合中删除所有索引,就可以解决我的问题。有人可以解释为什么这导致我的程序崩溃吗?我认为这可能与旧的用户模型有关,但我不太了解。谢谢!

答案 2 :(得分:0)

即使您将所有键都设置为unique = False ,您仍可能会收到 E11000重复键错误。因此,在这种情况下,只需按照以下步骤操作,然后检查您的错误是否已解决。

  • 删除集合中的所有文档(例如db.collection_name.deleteMany({}))
  • 删除集合(不要添加数据库)(例如db.collection_name.drop())

干杯!