@belyaevcyrill

Как в Mongoose создать уникальное поле?

У меня есть схема пользователя такого вида:
const userSchema = new Schema(
    {
        login: {
            type: String,
            required: true,
            unique: true
        },
        passwd: {
            type: String,
            required: true
        }
    {
        timestamps: {
            createdAt: "created_at",
            updatedAt: "updated_at"
        }
    }
);

const User = model("user", userSchema, "user", true);


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

То есть, я могу спокойно добавить двух пользователей с одинаковым логином:
User.create({
    login: "user123",
    passwd: "123"
});

User.create({
    login: "user123",
    passwd: "123"
});

Никаких исключений не будет.

Как тогда проверять уникальность поля login? Получается придется определять хук
// Срабатывает до операции сохранения
userSchema.pre("save", function() { 
});

и в нём проверять, существует ли такой логин? Или есть какие-то другие способы?
  • Вопрос задан
  • 63 просмотра
Пригласить эксперта
Ответы на вопрос 1
andreimakushkin
@andreimakushkin
JavaScript Developer
При попытке создания пользователя с уже существующем логином, Mongo выдаст ошибку, что-то вроде этой:
E11000 duplicate key error collection...

Лучше дополнительно вручную обработать этот сценарий

const createUser = async (req, res) => {
  // Проверяем наличие входящих данных
  if (!req.body.login || !req.body.passwd) {
    return res.status(400).json({
      message: 'Логин и пароль обязательны для заполнения',
    });
  }

  try {
    // Проверяем, есть ли в бд пользователь с таким логином
    const user = await User.findOne({ login: req.body.login }).exec();

    // Если пользователь найден возвращаем ошибку, иначе создаем его
    if (user) {
      res.status(409).json({ message: 'Пользователь с таким логином уже зарегистрирован' });
    } else {
      await User.create(req.body);
      res.status(201).json({ message: 'Пользователь создан' });
    }
  } catch (error) {
    console.error(error);
    res.status(400).end();
  }
};
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
ImageSpark Санкт-Петербург
от 60 000 ₽
SAYMON Санкт-Петербург
от 120 000 до 200 000 ₽
30 мая 2020, в 21:47
2000 руб./за проект
30 мая 2020, в 20:00
1000 руб./за проект