Javascript 如何迭代整个数组?然后更新数据库
我正在进行一个与活动相关的项目,在该项目中,我需要确保两个活动不能在同一地点设置在相同的时间 为此,每当添加新事件时,我都使用find()获取具有相同事件地点的所有事件,然后迭代以检查新事件计时槽是否与数据库中具有相同地点的其他事件冲突 我有两个错误: 1) 发送邮件后无法设置邮件头 2) 我认为我的迭代逻辑是不正确的,我希望完全检查数组,然后插入,如果同一活动地点对任何XYZ活动有不同的计时 我试着使用过滤器,减少等,但似乎没有达到预期的效果Javascript 如何迭代整个数组?然后更新数据库,javascript,arrays,node.js,loops,http-headers,Javascript,Arrays,Node.js,Loops,Http Headers,我正在进行一个与活动相关的项目,在该项目中,我需要确保两个活动不能在同一地点设置在相同的时间 为此,每当添加新事件时,我都使用find()获取具有相同事件地点的所有事件,然后迭代以检查新事件计时槽是否与数据库中具有相同地点的其他事件冲突 我有两个错误: 1) 发送邮件后无法设置邮件头 2) 我认为我的迭代逻辑是不正确的,我希望完全检查数组,然后插入,如果同一活动地点对任何XYZ活动有不同的计时 我试着使用过滤器,减少等,但似乎没有达到预期的效果 _this.insert = function(r
_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
});
}
}
});
});
});
};
如果具有相同名称的事件没有时间冲突,则会添加新事件,否则表示可以添加事件,等等
1) 发送邮件后无法设置邮件头
res.json()
不会结束脚本。如果不希望执行下面的代码,请始终使用返回res.json()
或添加其他条件
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
}
原因
发送后无法设置标题
请求的响应已发送,请尝试从map函数中发送响应。此外,如果有行代码可以在发送响应后执行,则在发送响应后添加return语句
您不需要遍历find查询中的所有文档。使用$gte和$lte operator查找当时是否有任何事件
您的查询可以修改为
_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 } },
嘿,谢谢你的回答。受此启发,我运用了类似的逻辑,并能够完成我的工作。非常感谢。
_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 } },