Обработка ошибок: E11000 коллекция дубликатов ошибок ключа - PullRequest
0 голосов
/ 06 июля 2018

У меня проблема с пользовательской моделью, которую я использую с 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 }"
}

Согласно документации mongoose: Если существует более одного документа (второго пользователя) без значения для индексированного поля или отсутствует индексированное поле, построение индекса завершится ошибкой с ошибкой дублированного ключа. Я не знаю, как установить это свойство _id для свойства трекеров - я думал, что оно генерируется автоматически!

Вот часть трекеров моей схемы. И соответствующее свойство case_id, которое, похоже, выдает «нулевую» ошибку.

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 ]

0 голосов
/ 08 июля 2018

Оказывается, это было связано с моей базой данных mongodb, а не с моим кодом. После поиска по сети я обнаружил, что если я вошел в оболочку mongo, а затем удалил все индексы из коллекции пользователей, это решило мою проблему. Может ли кто-нибудь объяснить, почему это вызывало сбой моей программы? Я думаю, что это может быть связано со старой моделью пользователя, но я не совсем понимаю. Спасибо!

0 голосов
/ 06 июля 2018

Я предполагаю, что существует индекс на CourtCaseSchema.case_id, который не допускает дублирование.

Я думаю, вы могли бы проверить (в оболочке Монго), что с CourtAPIDev.court_cases.getIndexes() (я думаю, ваш БД называется CourtAPIDev, а коллекция - court_cases, но я не уверен в этом).

Также, если вы очищаете тестовую базу данных после каждого запуска, это объясняет, почему тесты проходят, поскольку не более одного пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...