将某些自动值键应用于所有 SimpleSchemas

Apply certain autovalue keys to all SimpleSchemas

我有某些键,例如 createdAt 和 updatedAt,它们应该在所有模式中定义。有没有办法避免代码重复?

我使用 SimpleSchema 包。

我的所有 Schemas.xxx

都需要以下代码
createdAt: {
    type: Date,
    optional: true,
    autoValue: function() {
        if (this.isInsert) {
            return new Date;
        } else if (this.isUpsert) {
            return {$setOnInsert: new Date};
        } else {
            this.unset();
        }
    },
    autoform: {
        type: 'hidden'
    }
},
updatedAt: {
    type: Date,
    optional: true,
    autoValue: function() {
        if (this.isUpdate) {
            return new Date();
        }
    },
    autoform: {
        type: 'hidden'
    }
}

我会在这个非常好的包的帮助下做到这一点:matb33:collection-hooks 这会在你的 collections 之前和之后添加挂钩。所以你可以像这样添加 createdAt 和 updatedAt 字段:

对于CollectionName.insert();

CollectionName.before.insert(function (userId, doc) {
    var currentDate = new Date();
    doc.createdAt = currentDate;
    doc.updatedAt = currentDate;    // could be also null if you want
});

所以在上面的例子中总是在插入生效之前触发。这是 CollectionName.update();

CollectionName.before.update(function (userId, doc) {
    doc.updatedAt = new Date();
});

每当您更新 collection 时都会触发此事件。

创建一个子模式,然后将其包含在每个集合中,请注意 SimpleSchema 构造函数现在采用数组。

Schema._Basic = new SimpleSchema({
  userId: {
    type: String,
    optional: true
  },
  createdAt: {
    type: Date,
    label: 'Created at'
  },
  updatedAt: {
    type: Date,
    label: 'Updated at',
    optional: true
  },
  }
});

Schema.Client = new SimpleSchema([Schema._Basic,
  {
    address: {
      type: String
      optional: true
    }
  }
]);