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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:45:32