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

raj*_*aju 3 javascript mongoose mongodb node.js express

我以字符串格式从用户获取日期,并且在创建Schema对象并保存之前,我当前在控制器中转换为Date.有没有办法将这种逻辑转移到模型中,因为在我看来,Model是适合这种情况的地方

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

});
Run Code Online (Sandbox Code Playgroud)

目前我这样做

//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 {
    }
});
Run Code Online (Sandbox Code Playgroud)

在旁注中,如何在自定义函数检查中处理参数时如何断言.就像是

    req.assert('name', 'Name can\'t be empty').len(1, 1000);
Run Code Online (Sandbox Code Playgroud)

mat*_*ias 9

虽然我不确定其含义req.body.starttime,但我很确定你正在寻找Schema对象pre()函数,它是Mongoose Middleware的一部分,允许在保存数据之前执行回调函数的定义.可能这样的事情可以完成所需的工作:

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

RunSchema.pre('save', function(next) {
  this.starttime = new Date();
  next();
});
Run Code Online (Sandbox Code Playgroud)

请注意,save每次创建或更新记录之前都会调用该事件的回调函数.因此,这是明确设置"修改"时间戳的方法.

编辑:

感谢您的评论,我现在对您想要达到的目标有了更好的理解.如果您想在分配数据并将其持久保存到记录之前修改数据,您可以轻松利用set模式的属性:

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

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

function set(val, schemaType)
Run Code Online (Sandbox Code Playgroud)

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