在我的应用程序中,用户使用各个月,日和年字段输入生日。我想将其作为单个Date存储在数据库中。我觉得这比我做起来要容易得多,但是我已经钻了几个兔子洞。
我尝试过或考虑过的问题:
虚拟机:
不是一个真正的选择,因为它们实际上并不带有参数。我必须将这些字段合并到一个setDate
属性中,此时,无论在哪里进行合并,我都可能将它们转换为Date()
。
预保存挂钩:
我的dobDay
,dobMonth
和dobYear
字段在this
上不可访问,因为它们与文档中的字段不对应。
实例方法:
UserSchema.methods.formatDob = function (day, month, year) {
let dob = new Date( parseInt(year), parseInt(month) - 1, parseInt(day), 0, 0, 0, 0 );
return new Date(dob, '<YYYY-MM-DD>');
}
从概念上讲,这将适用于我的“编辑”路线,但不适用于“创建”路线。
exports.register = async function(req, res, next) {
try {
// instance methods not available yet
let user = db.User.create(req.body);
// method now available but too late to modify before inserting
在这种情况下,如果要调用实例方法并生成格式化的生日,则必须调用user.save()
,这是不必要的数据库访问。
手动更新用户
const { dobYear, dobMonth, dobDay } = req.body;
const dob = formatDob(dobDay, dobMonth, dobYear);
user = new db.User(); // can't pass in req.body here
// Now I have to manually set all the fields!
...
user.dob = dob;
user.save();
因为我无法像使用req.body
一样将db.User()
传递到新的db.User.create()
中,所以必须手动添加字段。一定有更好的方法。其他人如何做到这一点?