Избегайте дубликатов при сохранении новых данных с помощью mongoose - PullRequest
0 голосов
/ 02 февраля 2020

Я работаю над приложением, в котором я могу сохранить пункты назначения в моей базе данных Mon go. Я хотел бы выдать пользовательскую ошибку при попытке сохранить место назначения, которое уже существует в БД. Пн goose предотвращает это, но я хочу четкую и удобную обработку ошибок.

// post a new destination

router.post('/',
  (req, res) => {
    const newCity = new cityModel(
      {
        name: req.body.name,
        country: req.body.country
      }
    )
    newCity.save()
      .then(city => {
        res.send(city)
      })
      .catch(err => {
        res.status(500).send('Server error')
      })
  });

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Поскольку вы создали уникальный индекс, при попытке записи дубликата результат будет:

WriteResult({
   "nInserted" : 0,
   "writeError" : {
      "code" : 11000,
      "errmsg" : "E11000 duplicate key error index: test.collection.$a.b_1 dup key: { : null }"
   }
})

Ваш код:

Файл констант:

module.exports = {
    DUPLICATE_DESTINATION_MSG: 'Destionation values already exists',
    DUPLICATE_DESTINATION_CODE: 4000
} 

Код:

//post a new destination
const constants = require('path to constants File');
router.post('/',
    (req, res) => {
        const newCity = new cityModel(
            {
                name: req.body.name,
                country: req.body.country
            }
        )
        try {
            let city = await newCity.save();
            res.send(city)
        } catch (error) {
            if (error.code == 11000) res.status(400).send(`Destination - ${req.body.name} with country ${req.body.country} already exists in system`);
            /* In case if your front end reads your error code &
                it has it's own set of custom business relates messages then form a response object with code/message & send it. 
            if (error.code == 11000) {
                let respObj = {
                    code: constants.DUPLICATE_DESTINATION_CODE,
                    message: constants.DUPLICATE_DESTINATION_MSG
                }
                res.status(400).send(respObj);
            } */
        }
        res.status(500).send('Server error');
    })
1 голос
/ 02 февраля 2020

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

router.post("/", async (req, res) => {
  const { name, country } = req.body;

  try {
    const existingDestination = await cityModel.findOne({name,country});

    if (existingDestination) {
      return res.status(400).send("Destionation already exists");
    }

    let newCity = new cityModel({ name, country });

    newCity = await newCity.save();
    res.send(city);
  } catch (err) {
    console.log(err);
    res.status(500).send("Server error");
  }
});

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

...