Mongoose Уникальная обработка сообщений об ошибках поля - PullRequest
0 голосов
/ 07 ноября 2019

У меня проблема с уникальным полем в Mongoose

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

Теперь он отправляет всегда ошибку 500.

но есть ли способ эффективно обрабатывать сообщения об ошибках? Например, говорит (электронная почта уже существует или имя пользователя уже существует)?

const mongoose = require('mongoose');
const uniqueValidator = require('mongoose-unique-validator');

const userSchema = mongoose.Schema({

    email : {type: String, required: true, unique: true},
    password: {type : String, required: true},
    userid: {type : String},
    username: {type : String, required: true, unique: true},

})

userSchema.plugin(uniqueValidator);
userSchema.index({ '$**': 'text' })

module.exports = mongoose.model('User', userSchema);

и контроллеры узла:

exports.createUser = (req, res, next) => {
  bcrypt.hash(req.body.password, 10).then(
    (hash) => {
      const user = new User({
        email: req.body.email,
        password: hash,
        userid:req.body.userid,
    username:req.body.username,

      });
      user.save().then(
        () => {
          res.status(201).json({
            message: 'User added successfully!'
          });
        }
      ).catch(
        (error) => {
          res.status(500).json({
            error: error
          });
        }
      );
    }
  );
};

Спасибо за помощь

1 Ответ

0 голосов
/ 07 ноября 2019

Вы можете проверить, используется ли электронная почта или имя пользователя в начале вашего кода, и отправить 400-BadRequest со своим пользовательским сообщением, например так:

exports.createUser =  async (req, res, next) => {

    let user = await User.findOne({ email: req.body.email });
    if (user) return res.status(400).send("Email already exists");

    user = await User.findOne({ username: req.body.username});
    if (user) return res.status(400).send("Username already exists.");
    ...

Обратите внимание, что я поставил async, чтобывозможность использовать await.

Также я бы посоветовал вам использовать async / await вместо перехвата блоков, чтобы избавиться от ада обратного вызова. Ваш код может быть написан так с помощью async / await:

exports.createUser = async (req, res, next) => {
  try {
    const { email, password, userId, username } = req.body;

    let user = await User.findOne({ email });
    if (user) return res.status(400).json({ error: "Email already exists" });

    user = await User.findOne({ username });
    if (user) return res.status(400).send({ error: "Username already exists" });

    user = new User({ email, password, userId, username });
    const salt = await bcrypt.genSalt(10);
    user.password = await bcrypt.hash(user.password, salt);
    await user.save();

    res.status(201).json({ message: "User added successfully!" });
  } catch (error) {
    res.status(500).json({ error });
  }
};
...