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会在每次创建新文档时调用这个函数,生成实时的当前时间。具体修改如下:
- 去掉提前定义的
var now = moment(); - 将
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完全一致,正好验证了我们的问题分析:

修改后重启服务器,再发送POST请求,就能得到每次请求时的实时时间啦!
内容的提问来源于stack exchange,提问作者Pak Chu
相关产品推荐
相关产品推荐

