如何在保存到Mongoose(ExpressJS)之前在模型中格式化数据

我从string格式的用户得到date,我目前转换成控制器中的date之前创build模式对象和保存。 有没有办法将这个逻辑推到模型上,因为在我看来,模型是正确的地方

var RunSchema = new Schema({ created: { type: Date, default: Date.now }, starttime: { type: Date, default: Date.now } }); 

目前我这样做

 //req.body = {starttime;'2.05.2013 11:23:22'} var run = new Run(req.body); // util.getDate(datetime) returns false if invalid and Date() if valid // req.body.starttime = '2.05.2013 11:23:22'; run.starttime = util.getDate(req.body.starttime); run.save(function(err) { if(err) { } else { } }); 

在旁注中,如果我想在自定义函数检查中处理参数,我该如何断言。 就像是

  req.assert('name', 'Name can\'t be empty').len(1, 1000); 

虽然我不确定req.body.starttime的含义,但我确定您正在寻找作为Mongoose Middleware一部分的Schema对象pre()函数,并允许执行callback函数的定义数据保存之前。 可能像这样做是想要的工作:

 var RunSchema = new Schema({ [...] starttime: { type: Date, default: Date.now } }); RunSchema.pre('save', function(next) { this.starttime = new Date(); next(); }); 

请注意, save事件的callback函数每次在创build或更新logging之前都会调用。 所以这就是明确设置“修改”时间戳的方法。

编辑:

感谢你的评论,我现在对你想达到的目标有了更好的理解。 如果您想在数据被分配并保存到logging之前修改数据,则可以轻松使用架构的set属性:

 // defining set within the schema var RunSchema = new Schema({ [...] starttime: { type: Date, default: Date.now, set: util.getDate } }); 

假设对象util在范围内(必需的或其他),你当前的实现符合属性set的签名:

 function set(val, schemaType) 

可选参数schemaType允许您检查模式字段定义的属性,如果转换过程以任何方式依赖它。