Node.js 将节点模块导出为唯一实例

Node.js 将节点模块导出为唯一实例,node.js,express,module,scope,amd,Node.js,Express,Module,Scope,Amd,我正在使用restify在node中编写一个基本的restapi框架。为了支持这一点,我有几个我导出并需要的助手对象 我很难理解如何以这样的方式要求这些对象:每个传入的HTTP请求都使用helper对象的唯一实例。事实上,我需要()GET请求范围内的模块,但我感觉这不是最佳实践。例如: helper.js var helper = function(){ this.foo = new Date().getTime(); return this; }; helper.prototype.t

我正在使用restify在node中编写一个基本的restapi框架。为了支持这一点,我有几个我导出并需要的助手对象

我很难理解如何以这样的方式要求这些对象:每个传入的HTTP请求都使用helper对象的唯一实例。事实上,我需要()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();
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

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

  var helper = new Helper();
  helper.test()
});
test()工作:每个传入请求都有自己的helper作用域实例。如果我需要请求范围之外的帮助器文件,那么由于节点缓存所需文件的对象的方式,帮助器对象中的数据将在请求之间共享

但是,在本例中,helper.foo对于每个调用都是相同的,可能是因为require()调用通过“new”关键字接收1个实例

当我有一个helper函数,它使用一个随机字符串来命名一个文件时,我遇到了这个问题,但是因为我像下面那样声明了它,所以所有文件的名称都是相同的

helper.prototype.fileName = random(10) + ".json";
在请求范围内需要文件是否会产生任何负面后果?我可以想象,在处理高频流量时,为每个调用请求文件并不理想


通过express或restify考虑多个传入HTTP请求时,需要/导出模块的最佳做法是什么?我是否应该确保我正在编写的帮助程序不处理这些边缘情况?

好的,因此首先最好检查一下需要什么。弗雷德·K·肖特(Fred K.Schott)对此描述得非常好。因此,本质上,要求函数:

  • 尝试加载该文件
  • 如果可以,则返回module.exports
  • 缓存模块实例,以防再次使用
  • 下次您需要相同的文件时,它将返回缓存的版本
  • 因此,在您首先需要一个文件之后,再需要它就没有额外的开销了

    其次,您的问题是一个一般的javascript问题。要实现您想要实现的目标,请更改文件以执行以下操作:

    helper.js

    var helper = function(){
      this.foo = new Date().getTime();
      return this;
    };
    helper.prototype.test = function(){
      return new Date().getTime();
    };
    module.exports = new helper();
    
    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

    app.get("/", function(req, res){
      var helper = require("./helper");
      helper.test();
    });
    
    var Helper = require("./helper");    
    app.get("/", function(req, res){
    
      var helper = new Helper();
      helper.test()
    });
    
    这样,对于每个请求,helper总是唯一的


    因此,在分割代码时,尽量经常使用模块。它们只会增加初始开销,并且不会在高流量下固有地影响性能。

    Wow!明亮的真不敢相信我还没试过。你们知道节点来自哪里吗?节点起源于加拉帕戈斯岛渡渡鸟的进化树。这很有道理!这必须是节点继承其群集能力的地方!愚蠢的渡渡鸟宝宝!