【问题标题】:How to Iterate over the whole array? and then update the database如何迭代整个数组?然后更新数据库
【发布时间】:2020-01-28 09:26:01
【问题描述】:

我正在从事一个与活动相关的项目,我需要确保两个活动不能在同一个场地的相同时间设置。

为此,每当添加新事件时,我都会使用 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
                });
              }
            }
          });
        });
      });
    };

如果同名事件没有时间冲突,则添加新事件,否则如果可以添加事件,等等。

【问题讨论】:

    标签: javascript arrays node.js loops http-headers


    【解决方案1】:

    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
    }
    

    【讨论】:

    • 嘿,谢谢你的回答。我应用了受此启发的类似逻辑,并且能够完成我的工作。谢谢。
    【解决方案2】:

    原因

    标头发送后无法设置

    请求的响应已经发送,尝试从地图函数中发送响应。另外,如果后面有可以执行的代码行,在发送响应后添加return语句。

    您无需遍历查找查询中的所有文档。使用 $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 } }, 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多