【问题标题】:How to format data in Model before saving in Mongoose (ExpressJS)如何在保存在 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);

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案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'?
    猜你喜欢
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2013-03-26
    • 2020-02-26
    • 2011-11-29
    • 2017-12-30
    相关资源
    最近更新 更多