对node.js模块使用单例ish方法
我在基于表达式的应用程序中使用节点缓存。需要使用以下代码进行设置对node.js模块使用单例ish方法,node.js,express,module,singleton,Node.js,Express,Module,Singleton,我在基于表达式的应用程序中使用节点缓存。需要使用以下代码进行设置 const NodeCache = require( "node-cache" ); const myCache = new NodeCache( { stdTTL: 100, checkperiod: 120 } ); 之后,它可以像这样使用 myCache.get(key) 我遇到的问题是,在express设置中,路由是动态的,我无法访问index.js中声明的myCache常量,我在模块上读到了这些常量,并且理解它们是缓
const NodeCache = require( "node-cache" );
const myCache = new NodeCache( { stdTTL: 100, checkperiod: 120 } );
之后,它可以像这样使用
myCache.get(key)
我遇到的问题是,在express设置中,路由是动态的,我无法访问index.js中声明的myCache常量,我在模块上读到了这些常量,并且理解它们是缓存的,调用所需的每个新调用都会获得缓存版本
为了克服我的问题,并且能够从我想到的任何路由调用相同的对象,在我的路由中使用以下单例ish方法
var nodeCache = require('node-cache');
if (!nodeCache.instance) {
nodeCache.instance = new nodeCache({ stdTTL: 3600 });
}
nodeCache.instance.get('key');
这似乎工作得很好,但我不确定这个设置,如果这是应该做的事情,或者是否有更好的替代方案。CommonJS模块在第一次导入时进行评估,并且能够自然地提供单例作为导出值 cache.js模块可以是:
var nodeCache = require('node-cache');
module.exports = new nodeCache({ stdTTL: 3600 });
然后,无论在哪里使用cache.js,都会从中导入相同的节点缓存实例。它将在第一次导入时创建。如果它是第一次在index.js中导入的,那么是的,它是在那里创建的。关键是
require('./cache.js')===require('./cache.js')
,所以您在任何地方都使用相同的实例。所以我需要创建一个额外的模块来导出“实例化的”节点缓存模块?在我的代码中,我将实例添加到节点缓存模块本身,而不需要单独的模块,这不正常吗?是的,您需要创建单独的模块。添加实例
是不合适的,因为这是一种污染另一个模块的黑客行为,您需要背上节点缓存模块,而不是创建自己的模块。至于Express,您可以选择在设置表中存储应用程序范围的值,这很有意义,将用于单独的模块。谢谢