You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向数据库提交日期?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:53:55