NodeJS中如何跨文件共享工具函数以统一管理MongoDB集合名称
问题解决:Node.js多模块共享集合名称映射状态
拆分模块后,getLetter()的状态(nr变量)在每个模块中都是独立的,导致insertCollection、consumeCollection、dropCollection各自调用getLetter()时拿到的不是同一轮的映射对象,集合名称无法统一。以下是几种可行的解决方案:
方案1:将状态封装为单例闭包
修改getLetter.js,通过闭包维护共享状态,确保所有模块共用同一个nr变量:
// getLetter.js const XYZ = { I: 'X', II: 'Y', III: 'Z' }; const YZX = { I: 'Y', II: 'Z', III: 'X' }; const ZXY = { I: 'Z', II: 'X', III: 'Y' }; let nr = 1; // 导出单个函数,共享闭包内的状态 module.exports = function getLetter() { let obj; if (nr === 1) { obj = XYZ; nr++; return obj; } else if (nr === 2) { obj = YZX; nr++; return obj; } else if (nr === 3) { obj = ZXY; nr = 1; return obj; } };
关键注意:每轮循环中只调用一次getLetter(),将拿到的映射对象复用给三个操作函数,避免多次调用导致状态跳变。
方案2:循环入口统一获取映射对象
在server.js的循环函数中先拿到当前轮次的映射对象,再传递给三个操作函数,彻底消除模块间隐式的状态依赖:
// server.js const insertCollection = require('./insertCollection'); const consumeCollection = require('./consumeCollection'); const dropCollection = require('./dropCollection'); const getLetter = require('./getLetter'); function intervalFunction() { // 统一获取当前轮次的映射对象 const currentMapping = getLetter(); // 传递给三个函数使用 insertCollection(currentMapping); consumeCollection(currentMapping); dropCollection(currentMapping); } if (isInserted && isDropped) { setInterval(intervalFunction, 5000); }
修改三个操作文件接收映射对象:
insertCollection.js:
function insertCollection(currentMapping) { let newCollectionName = `collection_${currentMapping.III}`; // 插入逻辑... } module.exports = insertCollection;
consumeCollection.js:
function consumeCollection(currentMapping) { let actualCollection = `collection_${currentMapping.II}`; // 提供数据逻辑... } module.exports = consumeCollection;
dropCollection.js:
function dropCollection(currentMapping) { let oldCollection = `collection_${currentMapping.I}`; // 删除逻辑... } module.exports = dropCollection;
这个方案逻辑更清晰,状态流转明确,是更推荐的做法。
方案3:使用独立状态模块
创建单独的状态模块管理nr,所有模块从这里读取和修改状态:
// collectionState.js module.exports = { nr: 1 };
修改getLetter.js依赖这个状态模块:
// getLetter.js const XYZ = { I: 'X', II: 'Y', III: 'Z' }; const YZX = { I: 'Y', II: 'Z', III: 'X' }; const ZXY = { I: 'Z', II: 'X', III: 'Y' }; const state = require('./collectionState'); module.exports = function getLetter() { let obj; if (state.nr === 1) { obj = XYZ; state.nr++; return obj; } else if (state.nr === 2) { obj = YZX; state.nr++; return obj; } else if (state.nr === 3) { obj = ZXY; state.nr = 1; return obj; } };
这样所有模块引入的getLetter都会共享同一个state.nr,状态不会因模块拆分重置。
内容的提问来源于stack exchange,提问作者Java wanna bee
相关产品推荐
相关产品推荐

