代码之家  ›  专栏  ›  技术社区  ›  Harrison Cramer

错误处理:E11000重复密钥错误集合

  •  0
  • Harrison Cramer  · 技术社区  · 6 年前

    我在使用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));
                });
        });
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   L. Faros    6 年前

    我猜courtCaseSchema.case_id上有一个不允许重复的索引。

    我想你可以用 CourtAPIDev.court_cases.getIndexes() (我想你的数据库被命名为 CourtAPIDev 收藏的名字是 court_cases 但我不确定)。

    另外,如果在每次运行后清理测试数据库,这将解释为什么测试通过,因为只有一个用户。

        2
  •  0
  •   Harrison Cramer    6 年前

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