Как перебрать весь массив?а затем обновить базу данных - PullRequest
0 голосов
/ 28 сентября 2019

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

Для этого при каждом добавлении нового событияЯ использую find (), чтобы получить все события, имеющие одно и то же место события, и затем выполнить итерацию, чтобы проверить, не конфликтуют ли новые временные интервалы событий с другими событиями в базе данных с тем же местом.

Я получаю две ошибки:

1) не может установить заголовки после их отправки

2) Я думаю, что моя логика итерации неверна, я хочу, чтобы массив был проверен полностью, а затем вставлен, если то же самоеМесто проведения мероприятия имеет различное время для любого события XYZ.

Я пытался использовать фильтр, уменьшить и т. д., но, похоже, не смог достичь желаемых результатов.

_this.insert = function(req, res) {
      var obj = new _this.model(req.body);
      obj.save(function(err, item) {
        if (err && err.code === 11000) {
          res.sendStatus(400);
        }
        if (err) {
          return console.error(err);
        }
        _this.model.find({ event_ground: req.body.event_ground }, function(
          err,
          docs
        ) {
          events = docs;
          events.map(event => {

            if (event.event_date_time && event.event_end_time) {
              endTimeofEvent = moment(event.event_end_time);
              timeofEvent = moment(event.event_date_time);
              let isStartTime = moment(req.body.event_date_time).isBetween(
                timeofEvent,
                endTimeofEvent
              );
              debugger
              let isEndTime = moment(req.body.event_end_time).isBetween(
                timeofEvent,
                endTimeofEvent
              );
              debugger
              if (isStartTime === false && isEndTime === false) {
                console.log('DB UPDATED');
                debugger
                _this.userModel.updateOne(
                  {
                    _id: req.params.id
                  },
                  {
                    $push: {
                      events: item._id
                    }
                  },
                  function(err) {
                    if (err) {
                      res.status(404).json('Something Went Wrong');
                    }
                    res.sendStatus(200);
                  }
                );
                debugger
              } 
              if(isStartTime === true || isEndTime === true) {
                console.log('DB WONT BE UPDATED');
                res.status(400).json({
                  success: false,
                  msg:
                    'This Venue is booked from ' +
                    timeofEvent.format('LLL') +
                    ' & ' +
                    endTimeofEvent.format('LLL'),
                  status: false
                });
              }
            }
          });
        });
      });
    };

Если события с одинаковымиимя не имеет временного столкновения, добавляется новое событие, в противном случае может быть добавлено событие и т. д.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2019

Причина

Не удается установить заголовки после их отправки

Ответ на запрос уже отправлен, попробуйте отправить ответ из функции карты,Кроме того, добавьте оператор возврата после отправки ответа, если есть строки кода, которые могут быть выполнены позже.

Вам не нужно перебирать все документы в запросе поиска.Используйте операторы $ gte и $ lte, чтобы определить, есть ли какое-либо событие во времени.

Ваш запрос может быть изменен на

 _this.model.find({ event_ground: req.body.event_ground,event_date_time : {"$gte":req.body.event_date_time},event_end_time : {"$gte" :req.body.event_date_time } }, 
0 голосов
/ 28 сентября 2019

1) не может установить заголовки после их отправки

function(err) {
   if (err) {
      res.status(404).json('Something Went Wrong');
   }
      res.sendStatus(200);
}

res.json() не завершает сценарий.Всегда используйте return res.json() или добавьте else condition, если вы не хотите, чтобы выполнялся приведенный ниже код.

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

Вы запускаете map, чтобы выполнить итерацию всего результата, но мгновенно обновите базу данных, как только будет выполнено условие (isStartTime === false && isEndTime === false).

Это нормально, если у вас есть ровно одна запись, но вы не справитесь, если дублирующаяся запись не является первым результатом.Я думаю, что вам лучше выполнить проверку состояния при поиске в базе данных.Если у вас есть веская причина не выполнять фильтрацию при поиске в базе данных, я предлагаю вам сделать следующее:

let duplicate = events.filter(event => {
    // filter records that match (isStartTime === true || isEndTime === true)
});
if (duplicate.length > 0) {
    // return error message
} else {
    // update database
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...