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

时间:2015-03-05 07:20:51

标签: node.js express module scope amd

我正在使用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()有效:每个传入的请求都有自己的作用域助手实例。如果我需要帮助文件在请求范围之外,那么辅助对象中的数据将在请求之间共享,因为节点缓存了所需文件的对象。

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

当我有一个使用随机字符串命名文件的辅助函数时,我遇到了这个问题,但因为我已经声明它(如下),所有文件都被命名为相同。

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

请求范围内的文件是否会产生任何负面影响?我想在处理高频流量时,为每个呼叫请求文件并不理想。

在通过快递或解析来考虑多个传入的HTTP请求时,要求/导出模块的最佳做法是什么?我应该确保我写的帮助者不处理这些边缘情况吗?

1 个答案:

答案 0 :(得分:2)

好的,首先,重温一下需要做什么就好了。 Fred K. Schott非常清楚地描述了thenodeway.io。基本上,需要函数:

  1. 尝试加载文件
  2. 如果可以,则返回module.exports
  3. 将模块实例缓存,因此需要再次使用它。
  4. 下次需要相同文件时,会返回缓存版本。
  5. 因此,在您需要一个文件开头之后,再没有需要额外的开销。

    其次,您的问题是一般的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()
    });
    

    这样,帮助对每个请求始终是唯一的。

    因此,在分割代码时,请经常尝试使用模块。它们只会增加初始开销,并且不会对繁重的流量产生固有的影响。