Проверьте, существует ли значение MongoDB перед вставкой - PullRequest
0 голосов
/ 10 февраля 2019

Я создаю MEAN-приложение с Twilio, которое позволяет людям подписывать онлайн-петицию, отправляя свое имя приложению.Люди должны иметь возможность подписать петицию только один раз.Я планирую обеспечить это, разрешив только одну подпись на номер телефона.

Каждый раз, когда подписывается петиция, создается объект Монго, подобный этому:

{ 
  "_id" : ObjectId("5c5a47ae8f04f9148f43b033"),          
  "name" : "John Doe", 
  "number" : "+18373987466", 
  "date" : "2/5/19" 
}

Я уже включилnumber поле в уникальный индекс , поэтому для каждого номера телефона может быть только подпись.

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

На мой взгляд, у меня есть два варианта:

ОПЦИЯ № 1 Запросите базу данных, чтобы узнать, был ли уже введен тот же номер.

Это кажется чем-то простым, но я просто не могу понять, как это сделать.

var number = '+18373987466';
if(collection.find({"number":number}) {
  twiml.message("You have already signed the petition");
}

Я думаю, что collection.find({"number":number}) вернет true, если найдет запись с тем же номером.Однако он возвращает весь курсор Mongo.

OPTION # 2 Поскольку number является уникальным индексом, Mongo выдаст ошибку, если другой объект будет создан с тем же значением.Я мог бы перехватить сгенерированную ошибку и впоследствии отправить сообщение пользователю.

Мой первый вопрос с этим подходом: хороший ли дизайн программного обеспечения, чтобы сознательно позволить вашему приложению выдавать ошибку?

Я попробовал этот подход с блоком try/catch, но возникшая ошибка сразу же вызвала сбой приложения.

try {
  collection.insertOne(
    {name : name, number : number, date: dateSigned}, 
    function(error, result) {
      console.log(`${name} has been added to the database`);
  });
} catch (error) {
  // handle error
}

Разве это не правильный способ «перехватить» ошибку и предотвратить ее сбой?приложение?

1 Ответ

0 голосов
/ 10 февраля 2019

Опция # 1

Описанное поведение правильное, MongoDB вернет курсор, если вы используете collection.find().Вы можете использовать collection.count () .Но так как вас интересует только если уже есть хотя бы одно значение, вы можете просто позвонить cursor.limit(1).

if (collection.find({"number":number}).limit(1).length === 1) 
   twiml.message("You have already signed the petition");

Option # 2

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

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

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