【发布时间】:2015-05-01 19:08:41
【问题描述】:
所以我正在使用预订系统,或者尝试这样做。我有一个 start_block 和 end_block,整数代表一天中的可预订时间。
我的架构如下:
var ReservationSchema = new Schema({
rid: {type: Number},
day: {type: Date},
start_block: {type: Number},
end_block: {type: Number},
kind: {type: String},
agent: {type: Schema.Types.ObjectId, ref: 'User'},
primary_client: {type: Schema.Types.ObjectId, ref: 'User'},
secondary_clients: [{type: Schema.Types.ObjectId, ref: 'User'}],
created_date: {type: Date, default: Date.now},
updated_date: {type: Date, default: Date.now}
});
我的验证如下:
ReservationSchema.pre("validate", function (next, done) {
var self = this;
console.log("being validated");
mongoose.models["Reservation"]
.findOne({
$or: [
{start_block: {$gte: self.start_block, $lte: self.end_block}, rid: self.rid},
{end_block: {$gte: self.start_block, $lte: self.end_block}, rid: self.rid}
]
}, function (err, user) {
if (err) {
console.log(err);
done(err);
} else if (user) {
console.log("blocked!!!!");
self.invalidate("start_block", "Times overlap");
done(new Error("Times Slots Cannot Overlap"));
} else {
console.log("passed");
done();
}
});
next();
});
我的类型播种在这里:
Reservation.find({}).remove(function(){
User.find({}).limit(1)
.exec(function (err, result) {
if(err) throw err;
var person = result[0];
if(person != null){
for(var i = 0; i <= 25; i++){
var start = Math.floor(Math.random() * 31) + 1;
Reservation.create({
rid: Math.floor(Math.random() * 6) + 1,
day: new Date("1985-10-06"),
start_block: start,
end_block: start + Math.floor(Math.random() * 1) + 2,
agent: person._id,
primary_client: person._id,
kind: "Reservation"
});
}
}
}
);
});
播种时我的一部分输出日志,各种疯狂的控制台日志...... 正在验证中
{ [CastError: Cast to number failed for value "undefined" at path "end_block"]
message: 'Cast to number failed for value "undefined" at path "end_block"',
name: 'CastError',
type: 'number',
value: undefined,
path: 'end_block' }
being validated
being validated
{ [CastError: Cast to number failed for value "undefined" at path "end_block"]
message: 'Cast to number failed for value "undefined" at path "end_block"',
name: 'CastError',
type: 'number',
value: undefined,
path: 'end_block' }
passed
passed
最后,结果是,当放置在基于 div 的表上时,预订仍然重叠......已经尝试了好几个小时,但谷歌搜索失败让我来到这里,希望有更聪明的头脑。谢谢!
编辑:清除了清理日志的额外空白创建。但是仍然无法弄清楚为什么每个条件都通过而没有找到重叠的插槽。一定有逻辑问题。我已经写出来了,没看到……
这是他重叠的样子......
预留 19 与其他两个预留重叠
我已经重写了我的规则 100 次,这就是它们现在的样子..
.findOne({
$or: [
{start_block: {$gte: self.start_block, $lt: self.end_block}, rid: self.rid},
{start_block: {$gt: self.start_block, $lte: self.end_block}, rid: self.rid},
{end_block: {$lte: self.start_block, $gt: self.end_block}, rid: self.rid},
{end_block: {$lt: self.start_block, $gte: self.end_block}, rid: self.rid}
]
}, function (err, user) {
if (err) {
console.log('error)');
console.log(err);
done(err);
} else if (user) {
console.log("blocked!!!!");
self.invalidate("start_block", "Times overlap");
done(new Error("Times Slots Cannot Overlap"));
} else {
console.log("passed");
done();
}
【问题讨论】:
标签: node.js mongoose mean-stack