如何在保存在 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 (ExpressJS) 之前在模型中格式化数据