【问题标题】:Mongoose Validation Logic Failing on Number ComparisonsMongoose 验证逻辑在数字比较上失败
【发布时间】: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


    【解决方案1】:

    我不确定它为什么存在,但是您将一个空的 {} 对象作为第二个参数传递给您的 Reservation.create 调用。这将被视为要创建的第二个文档,但它没有您的验证器期望的字段。

    所以删除第二个参数,让调用看起来像这样:

    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"
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 2018-01-18
      相关资源
      最近更新 更多