MomentJS add函数无法添加时间问题求助
问题分析与解决方案
核心问题点
keysSchema.find({ Key: key })返回的是文档数组,不是单个对象,直接访问keysDB.Time会得到undefined,MomentJS 的add方法遇到undefined会视为添加0天,所以时间没有变化。- 代码中重复调用了
todayCurTime.add(keysDB.Time, 'days'),导致时间被累加两次(一次赋值给UserDB,一次在console.log)。 - 若
keysDB.Time存储的是字符串类型,需要先转为数字才能被MomentJS正确识别。
修正后的代码
// 改用findOne获取单个密钥文档,而非数组 let userDB = await userSchema.findOne({ UserID: id }); let keysDB = await keysSchema.findOne({ Key: key }); // 提前判断密钥是否存在,避免后续报错 if (!keysDB) { console.log("无效密钥"); return; } // 初始化moment对象,无需多余clone const today = moment(); // 确保时间增量是数字类型 const daysToAdd = Number(keysDB.Time); // 计算最终过期时间,只调用一次add const expireTime = today.add(daysToAdd, 'days'); // 处理用户存在/不存在的情况,避免重复插入 if (userDB) { userDB.Time = expireTime.toDate(); await userDB.save().catch(err => console.log(err)); } else { userDB = new userSchema({ Name: name, Discrim: discrim, UserID: id, Time: expireTime.toDate() // 若Schema中Time是Date类型,需转原生Date对象 }); await userDB.save().catch(err => console.log(err)); } console.log(`更新后的时间: ${expireTime.format('YYYY-MM-DD HH:mm:ss')}`);
额外注意事项
- 如果MongoDB Schema中
Time字段定义为Date类型,必须用expireTime.toDate()把moment对象转为原生JavaScript Date对象再存入。 - 建议对
daysToAdd做合法性校验,比如判断是否为正整数,避免非数值导致的异常。
内容的提问来源于stack exchange,提问作者Cyrus
相关产品推荐
相关产品推荐

