Node.js Mongoose验证逻辑在数字比较上失败
所以我在使用预约系统,或者尝试。我有一个开始块和结束块,整数代表一天中可预订的时间 我的模式如下:Node.js Mongoose验证逻辑在数字比较上失败,node.js,mongoose,mean-stack,Node.js,Mongoose,Mean Stack,所以我在使用预约系统,或者尝试。我有一个开始块和结束块,整数代表一天中可预订的时间 我的模式如下: 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.Object
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();
});
我的确认如下:
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"
});
}
}
}
);
});
最后,结果是,当放置在基于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();
}
我不确定它为什么在那里,但您正在将一个空的
{}
对象作为第二个参数传递给您的预订。创建调用。这将被视为要创建的第二个文档,但它没有您的验证器所期望的字段
因此,请删除第二个参数,使调用看起来像这样:
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"
});