Как распознать или получить уникальное имя поля из драйвера mongoose с несколькими уникальными полями - PullRequest
0 голосов
/ 08 сентября 2018

Я создал схему пользователя, в которой адрес электронной почты и имя пользователя уникальны. Когда я пытаюсь сохранить пользователя с именем пользователя, которое уже существует в коллекции, MongoDb (драйвер mongoose) возвращает следующую ошибку.

"error": {
        "driver": true,
        "name": "MongoError",
        "index": 0,
        "code": 11000,
        "errmsg": "E11000 duplicate key error collection: todo.users index: username_1 dup key: { : \"sak\" }"
    }

Но когда я пытаюсь сохранить пользователя с адресом электронной почты, который уже существует в коллекции, возникает такой же тип ошибки, возвращаемый MongoDb (драйвером mongoose), как этот.

"error": {
    "driver": true,
    "name": "MongoError",
    "index": 0,
    "code": 11000,
    "errmsg": "E11000 duplicate key error collection: todo.users index: email_1 dup key: { : \"sachin121@gmail.com\" }"
}

Это моя пользовательская схема -

const UserSchema = new mongoose.Schema(
    {
        email: {
            type: String,
            lowercase: true,
            trim: true,
            index: true,
            unique: true,
            required: true
        },
        username: {
            type: String,
            lowercase: true,
            trim: true,
            index: true,
            unique: true,
            required: true
        },
        password: {
            type: String,
            required: true,
            bcrypt: true
        },
        name: {
            type: String,
            trim: true,
            required: true
        }
    });

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Чтобы избежать этого типа MongoError, вы можете использовать mongoose-unique-validator , который проверяет наличие уникальных ключей в существующих документах, если они уже существуют. В вашей схеме так же используйте этот плагин как:

import { Schema } from "mongoose";
const uniqueValidator = require('mongoose-unique-validator');

const UserSchema = new Schema({
    email: {
        type: String,
        lowercase: true,
        trim: true,
        index: true,
        unique: true,
        required: true
    },
    username: {
        type: String,
        lowercase: true,
        trim: true,
        index: true,
        unique: true,
        required: true
    },
    password: {
        type: String,
        required: true,
        bcrypt: true
    },
    name: {
        type: String,
        trim: true,
        required: true
    }
});

UserSchema.plugin(uniqueValidator, {
    type: 'mongoose-unique-validator',
    message: 'Error, expected {PATH} to be unique.'
});

Здесь вы можете установить пользовательское сообщение, а также изменить тип ошибки с MongoError, но оно имеет ограничение, упомянутое в документе этого плагина .

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

Вне автоматической блокировки коллекции или форсирования одного связи, реального решения нет.

Для большинства наших пользователей это не будет проблемой, но это крайний случай для быть в курсе.

0 голосов
/ 08 сентября 2018

Чтобы получить индекс ошибки (он-лайн адрес электронной почты или имя пользователя), вам нужно проанализировать строку errormsg и взять свойство, которое упоминается после слова index: в сообщении об ошибке.

Возникла проблема в этом конкретном обсуждении, и был предложен этот ответ. Взгляните на вопрос здесь

Существует модуль узла, который позаботится об этом mongoose-unique-validator , чтобы вы могли использовать его и получать ошибку как обычную ошибку проверки:

{

    message: 'Validation failed',

    name: 'ValidationError',

    errors: {

        username: {

            message: 'Error, expected `username` to be unique. Value: `JohnSmith`',

            name: 'ValidatorError',

            kind: 'unique',

            path: 'username',

            value: 'JohnSmith'

        }

    }

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