如何向数据库提交日期?Date.now存入无显示的问题排查
问题原因分析
你碰到的核心问题是:你在控制器里主动从请求体req.body获取postDate,但如果前端没传递这个字段,它会被设为undefined,这直接覆盖了mongoose Schema中设置的默认值规则。
mongoose的default逻辑是:只有当创建文档时该字段完全未被定义,才会自动启用默认值。但你现在明确给jobs数组里的postDate赋值为req.body.postDate(大概率是undefined),所以默认值根本不会触发。
解决方案
根据你的需求,有两种实用的处理方式:
方式一:依赖mongoose默认值(推荐)
既然已经在Schema里配置了default: Date.now,完全不需要前端传递这个字段,也不用在控制器里手动赋值。修改控制器代码如下:
exports.create = function(req, res, next) { var user = req.user; // 直接push空对象,mongoose会自动给postDate填充默认的当前时间 var count = user.jobs.push({}); user.save(function(err) { if (err) { return next(err); } // 从保存后的user里取最新的job数据返回,确保拿到的是带默认值的postDate const newJob = user.jobs[user.jobs.length - 1]; res.json({ job: { postDate: newJob.postDate } }); }) }
这样你发起POST请求时,不需要在请求体里携带postDate,mongoose会自动帮你生成并存储当前时间。
方式二:手动兼容前端传递的日期(可选)
如果你希望前端可以自定义传递日期,同时在前端没传的时候用当前时间,可以在控制器里做判断处理:
exports.create = function(req, res, next) { var user = req.user; // 前端传了日期就转成Date对象,没传就用当前时间 var postDate = req.body.postDate ? new Date(req.body.postDate) : Date.now(); var count = user.jobs.push({ postDate: postDate }); user.save(function(err) { if (err) { return next(err); } res.json({ job: { postDate: postDate } }); }) }
这里要注意:如果前端传递的是字符串格式的日期,一定要用new Date()转换为Date对象,否则mongoose可能无法正确存储为日期类型。
额外调试建议
- 检查前端POST请求的请求体,确认没有错误传递
postDate: null或者postDate: ""这类值,这些会被mongoose视为有效赋值,同样不会触发默认值。 - 保存后可以在控制台打印
user.jobs,直观确认postDate是否被正确设置,方便快速定位问题。
内容的提问来源于stack exchange,提问作者Markus Hayner
相关产品推荐
相关产品推荐

