Получить все дубликаты ключей из POST-запроса с помощью mongoose

#javascript #node.js #mongodb #typescript #mongoose

#javascript #node.js #mongodb #typescript #mongoose

Вопрос:

Я решил попробовать typescript и создать небольшой API аутентификации с помощью express. Что я хотел сделать сейчас, так это сделать username и email уникальным, поэтому моя схема mongoose выглядит следующим образом:

 import * as mongoose from 'mongoose';

const userSchema = new mongoose.Schema({
  username: {
    type: String,
    required: [true, 'Username is required!'],
    unique: true,
    min: 6,
    max: 255,
  },
  email: {
    type: String,
    required: [true, 'Email is required!'],
    unique: true,
    min: 6,
    max: 255,
  },
  password: {
    type: String,
    required: [true, 'Password is required!'],
    min: 6,
    max: 1024,
  },
  date: {
    type: Date,
    default: Date.now(),
  },
});

export const User = mongoose.model('User', userSchema);
  

Мой контроллер также очень прост:

 export async function registerUser(
  req: express.Request,
  res: express.Response,
): Promise<express.Response> {
  const user = new User({
    username: req.body.username,
    email: req.body.email,
    password: req.body.password,
  });
  const error = user.validateSync();
  if (error) {
    return res.status(400).json(error);
  }
  await user.save(function (err) {
    if (err) {
      return res.status(400).send(err);
    }
    return res.status(200).send({ success: true, message: 'User created!' });
  });
}
  

Все это работает, как и ожидалось, однако, если я выполняю POST-запрос, в котором и адрес электронной почты, и имя пользователя уже существуют в базе данных, я не получаю ответа с обоими из них в теле. Например, если я сделаю POST-запрос с:

 {
    "username": "username2",
    "email": "emailblabla2",
    "password": "password1234"
}
  

где username2 и emailblabla2 уже использовались, я сначала получу:

 {
    "driver": true,
    "name": "MongoError",
    "index": 0,
    "code": 11000,
    "keyPattern": {
        "username": 1
    },
    "keyValue": {
        "username": "username2"
    }
}
  

в качестве ответа и со второй попытки я получу то же самое, но для электронной почты.

Возможно ли получить оба одновременно? Должен ли я вообще использовать mongoose для проверки моих данных? Я вижу, что многие люди рекомендуют joi, однако я подумал, что если mongoose уже способен на это, зачем использовать для этого дополнительную библиотеку.

Комментарии:

1. этот вызов validateSync мне не нравится

2. mongoosejs.com/docs/… похоже, вы получаете ошибку первого дубликата ключа из-за вашего индекса mongo. стоит попробовать написать свой собственный валидатор

3. Почему? Это для вызова валидаторов mongoose (которые, к сожалению, не включают дубликаты , отсюда и дополнительная функция с ошибкой)

4. Честно говоря, это всего лишь предположение. Как будет работать проверка вашей базы данных без ввода-вывода? Учитывая выбор между синхронным вызовом и асинхронным, я бы выбрал асинхронный. но, возможно, я ошибаюсь в этом контексте