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

Mongoose中Moment.js生成的Timestamp不更新问题求助

问题排查与修复方案

嘿,我一眼就看出问题出在哪了!你遇到的timestamp字段不更新的问题,根源在Mongoose Schema默认值的设置方式上。

问题原因分析

你在定义UserSchema时,timestamp字段的默认值是直接计算好的字符串:

var now = moment();
// ...
timestamp: {type: String, default: now.format("dddd, MMMM Do YYYY, h:mm:ss a")}

这段代码会在Node.js服务器启动的那一刻就计算出now.format(...)的结果,并把这个固定字符串作为默认值存起来。之后不管过多久发送POST请求,Mongoose都会重复使用这个一开始就生成好的时间,这就是为什么两次间隔30秒的请求得到的timestamp完全一致。

修复方案

把timestamp的默认值改成一个函数,这样Mongoose会在每次创建新文档时调用这个函数,生成实时的当前时间。具体修改如下:

  1. 去掉提前定义的var now = moment();
  2. 将timestamp的default值替换为一个返回当前格式化时间的函数

修改后的核心代码:

var mongoose = require('mongoose'); 
var moment = require('moment'); 

var UserSchema = new mongoose.Schema({ 
  email: { type: String, default: ''}, 
  name: { type: String, default: ''}, 
  password: { type: String, default: ''}, 
  timestamp: {
    type: String, 
    default: () => moment().format("dddd, MMMM Do YYYY, h:mm:ss a")
  } 
}); 

module.exports = mongoose.model('User', UserSchema); // 模型名建议用单数形式,更符合Mongoose规范

// 控制器代码保留,注意模型引用要和上面一致
module.exports = { 
  find: function(params, callback) { 
    User.find(params, function(err, result) { 
      if (err) { callback(err, null); return; } 
      callback(null, result); return; 
    }); 
  }, 
  create: function(params, callback) { 
    User.create(params, function(err, result) { 
      if (err) { callback(err, null); return; } 
      callback(null, result); return; 
    }); 
  } 
}

额外优化提示

其实Mongoose自带了原生的时间戳功能,如果你不需要自定义格式的时间,可以直接在Schema里启用timestamps选项,它会自动添加createdAt和updatedAt两个Date类型字段,后续时间操作会更灵活:

var UserSchema = new mongoose.Schema({ 
  // ... 其他字段定义
}, { timestamps: true });

问题验证截图

从你提供的截图能明显看到两次请求的timestamp完全一致,正好验证了我们的问题分析:
请求结果截图1
请求结果截图2

修改后重启服务器,再发送POST请求,就能得到每次请求时的实时时间啦!

内容的提问来源于stack exchange,提问作者Pak Chu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:19:31