如何用Sequelize校验用户输入时间是否在数据库时间的指定区间内?
Sequelize后端实现会议时间区间校验方案
用户前端已通过moment.js的isBetween方法实现功能:检查用户输入的时间是否处于数据库已有会议时间的前1小时至后2小时区间内。现需在后端使用Sequelize实现相同逻辑,校验指定日期下,用户输入的时间是否与数据库中已存在的会议时间存在该区间重叠。
用户现有代码
后端当前代码
const db = require("../models"); const Meet = db.meet; checkDuplicateTime = (req, res, next) => { Meet.findAll({ where: { tanggal: req.body.date, waktu: req.body.time } }).then(time => { if(time --- (1000 * 60 * 60) || time +++ (2000 * 60 * 60)) { res.status(400).send({ message: "Failed! Time already use!!" }); return; } next(); }); }); }
前端实现代码
timedi() { const timede = this.dateCheck.filter((item) => { return moment(item.dates).isSame(new Date(this.dates), "day") }).some((item)=> { const format = 'hh:mm:ss' const time = moment(this.time, format) // from input user const beforeTime = moment(item.time, format).add(-1, 'hours') // from already database const afterTime = moment(item.time, format).add(2, 'hours'); // from already database if(time.isBetween(beforeTime, afterTime)) { console.log('Ignore') } else { console.log('Allow') } }) },
修正后的Sequelize后端实现
需要引入Sequelize操作符,构造精准的查询条件来匹配时间区间冲突:
const db = require("../models"); const Meet = db.meet; const { Op } = require("sequelize"); // 引入Sequelize操作符 checkDuplicateTime = async (req, res, next) => { try { const { date, time } = req.body; // 将日期和时间拼接为完整的可计算时间对象 const userDateTime = new Date(`${date}T${time}`); // 查询指定日期下,存在时间区间冲突的会议 const conflictingMeeting = await Meet.findOne({ where: { tanggal: date, [Op.and]: [ // 已有会议时间减1小时后,仍晚于等于用户输入时间 Sequelize.where( Sequelize.fn('DATE_SUB', Sequelize.col('waktu'), Sequelize.literal('INTERVAL 1 HOUR')), Op.lte, userDateTime ), // 已有会议时间加2小时后,仍早于等于用户输入时间 Sequelize.where( Sequelize.fn('DATE_ADD', Sequelize.col('waktu'), Sequelize.literal('INTERVAL 2 HOUR')), Op.gte, userDateTime ) ] } }); if (conflictingMeeting) { return res.status(400).send({ message: "Failed! Time falls within the restricted interval of an existing meeting!!" }); } next(); } catch (err) { res.status(500).send({ message: err.message }); } };
关键逻辑说明
- 调用数据库原生函数
DATE_SUB和DATE_ADD,对应前端对时间的加减操作,直接在数据库层面完成计算,避免数据传输和前端后端时间格式差异问题 - 通过
Op.and组合双条件,确保用户输入时间落在已有会议时间的前1小时到后2小时区间内 - 使用
findOne替代findAll,只要找到一个冲突会议就终止查询,提升性能 - 增加异步异常捕获,保证接口在出现错误时能正常返回提示
内容的提问来源于stack exchange,提问作者Syahru Zein
相关产品推荐
相关产品推荐

