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

Posted

技术标签:

【中文标题】如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据【英文标题】:How to format data in Model before saving in Mongoose (ExpressJS) 【发布时间】:2014-06-24 03:04:51 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

RunSchema.pre('save', function(next) 
  this.starttime = new Date();
  next();
);

请注意,每次创建或更新记录之前都会调用save 事件的回调函数。因此,例如,这是显式设置“修改”时间戳的方式。

编辑:

感谢您的评论,我现在对您想要实现的目标有了更好的了解。如果您想在数据被分配并保存到记录之前对其进行修改,您可以轻松利用架构的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 允许您检查架构字段定义的属性(如果转换过程以任何方式依赖它)。

【讨论】:

感谢您的回复,我正在查看该行的内容,但 pre 函数如何访问值 '2.05.2013 11:23:22'?

以上是关于如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在保存在 Mongoose 之前检查数据库中是不是存在嵌入式文档

如何在 Mongoose 中使用预保存挂钩数据库值?

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

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

未能在 Mongoose 回调中保存

如何在 Mongoose/Node.js 中同时保存多个文档?