Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对node.js模块使用单例ish方法_Node.js_Express_Module_Singleton - Fatal编程技术网

对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,您可以选择在设置表中存储应用程序范围的值,这很有意义,将用于单独的模块。谢谢