导出一个节点模块作为唯一的实例

我正在使用restify在节点中编写一个基本的REST API框架。 为了支持这个,我有几个帮助对象,我导出和要求。

我无法理解如何以这样一种方式要求这些对象,即每个传入的HTTP请求使用唯一的助手对象实例。 实际上,我需要()模块在GET请求的范围之内,但是我觉得这不是最好的做法。 例如:

helper.js

var helper = function(){ this.foo = new Date().getTime(); return this; }; helper.prototype.test = function(){ return new Date().getTime(); }; module.exports = new helper(); 

main.js

 app.get("/", function(req, res){ var helper = require("./helper"); helper.test(); }); 

helper.test()工作原理:每个传入的请求都有它自己的帮助程序的作用域实例。 如果我需要请求范围之外的帮助程序文件,则由于节点caching所需文件的对象的方式,帮助程序对象内的数据将在请求之间共享。

但是,在这种情况下,helper.foo对于每个调用都是一样的,大概是因为require()调用通过“new”关键字接收1个实例。

我遇到这个问题时,我有一个帮助函数,使用随机string命名文件,但因为我已经声明它像(下),所有的文件被命名为相同的。

 helper.prototype.fileName = random(10) + ".json"; 

在请求范围内是否需要文件会产生任何负面影响? 我会想象,当处理高频率stream量时,对于每个呼叫请求文件都不是理想的。

当通过express或restify考虑多个传入的HTTP请求时,需要/导出模块的最佳实践是什么? 我应该确保我写的帮手不处理这些边缘情况吗?

好的,所以首先要做好需要做的事情。 弗雷德·K·肖特(Fred K. Schott)很好地描述了这一点 。 所以本质上,要求function:

  1. 试图加载文件
  2. 如果可以,则返回module.exports
  3. 将模块实例caching起来,因此您需要再次使用它。
  4. 下次需要相同的文件时,它将返回caching的版本。

所以在你需要一个文件开始之后,没有额外的开销来需要它。

其次,你的问题是一个一般的JavaScript问题。 要实现你想要实现的目标,请改变你的文件来做到这一点:

helper.js

 var helper = function(){ this.foo = new Date().getTime(); this.fileName = random(10) + ".json"; return this; }; helper.prototype.test = function(){ return new Date().getTime(); }; module.exports = helper; 

main.js

 var Helper = require("./helper"); app.get("/", function(req, res){ var helper = new Helper(); helper.test() }); 

这样,助手对于每个请求都是唯一的。

所以,在分割代码时,经常尝试使用模块。 它们只会增加初始开销,并不会因为交通繁忙而影响性能。