Node.js中SetMonthAndYear函数未返回预期false问题求助
问题排查与修复方案
核心问题分析
你的代码出现不符合预期的行为,主要由两个关键问题导致:
1. 逻辑错误:更新的是系统当前时间而非传入的时间戳对应时间
SetMonthAndYear方法中,当判断需要更新月份年份时,你将实例的currentYear和currentMonth设置为系统当前时间的年份和月份,而非传入timeStamp对应的时间。这会导致:
- 首次调用时,只要传入的时间戳和初始值
0/0不匹配,就会把实例属性覆盖为当前系统时间,返回true。 - 后续调用时,如果传入的时间戳年份/月份和系统当前时间不匹配,会再次进入更新逻辑并返回
true;但如果系统时间未变化,且传入时间戳和系统当前时间匹配,才会返回false。
你描述的第二次调用返回true却无更新日志的情况,大概率是对执行场景的描述偏差——按照代码逻辑,只有进入更新分支才会返回true,必然会打印日志。
2. Node.js模块的单例特性
你通过module.exports = new MyDateClass()导出类的实例,Node.js会缓存这个实例,所有require该模块的地方都会拿到同一个实例。这意味着currentMonth和currentYear会在全局保留状态,跨调用持续生效,这本身不是问题,但结合上述逻辑错误会放大异常。
3. 示例代码中的语法错误
OtherClass类顶层使用var currentTimeStamp是无效语法,需改用类字段语法。console.Log应为console.log(大小写错误),否则会抛出引用错误。- 类内部直接调用
main()无效,需实例化类后再调用方法。
修复方案
方案1:修正核心逻辑(按传入时间戳更新属性)
如果你期望根据传入的timeStamp设置实例的月份和年份,修改MyDateClass:
class MyDateClass { currentMonth = 0; currentYear = 0; async SetMonthAndYear(timeStamp){ const date = new Date(timeStamp); const targetYear = date.getFullYear(); const targetMonth = date.getMonth() + 1; // 修正月份偏移问题 if(targetYear !== this.currentYear || targetMonth !== this.currentMonth){ this.currentYear = targetYear; this.currentMonth = targetMonth; console.log("New month and year is set: " + this.currentMonth + " - " + this.currentYear); return true; } return false; } } module.exports = new MyDateClass();
方案2:修正OtherClass的语法错误
const dateClass = require('./MyDateClass.js'); // 补全路径引号 class OtherClass { currentTimeStamp = ~some timestamp~; // 使用类字段语法定义属性 async main(){ if (await dateClass.SetMonthAndYear(this.currentTimeStamp)) { // 用this访问实例属性 console.log("The month and year are modified"); // 修正console.log大小写 } console.log("Done."); } } // 实例化类并调用方法 new OtherClass().main();
方案3:可选——使用非单例实例
如果不需要全局共享同一个MyDateClass实例,可以导出类本身,每次使用时创建新实例:
// MyDateClass.js module.exports = MyDateClass; // OtherClass.js const MyDateClass = require('./MyDateClass.js'); const dateClass = new MyDateClass(); // 每次创建新实例
内容的提问来源于stack exchange,提问作者Quispie
相关产品推荐
相关产品推荐

