【问题标题】:Exporting a Node Module as a Unique Instance将节点模块导出为唯一实例
【发布时间】:2015-03-05 07:20:50
【问题描述】:

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

我无法理解如何要求这些对象,以使每个传入的 HTTP 请求都使用帮助器对象的唯一实例。事实上,我在 GET 请求范围内 require() 模块,但我觉得这不是最佳实践。例如:

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";

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

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

【问题讨论】:

    标签: node.js express module scope amd


    【解决方案1】:

    好的,所以首先了解一下 require 的作用。 Fred K. Schott 很好地描述了这一点thenodeway.io。所以本质上,require函数:

    1. 尝试加载文件
    2. 如果可以,则返回 module.exports
    3. 缓存模块实例,以防您需要再次使用它。
    4. 下次您需要相同的文件时,它会返回缓存的版本。

    因此,在您需要一个文件开始后,再次需要它不会产生额外的开销。

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

    这样帮助器对于每个请求总是唯一的。

    因此,在对代码进行分段时,请尝试经常使用模块。它们只会增加初始开销,不会从本质上影响大流量的性能。

    【讨论】:

    • 哇!杰出的。我不敢相信我没有尝试过。你知道节点是从哪里来的吗?
    • 节点来源于加拉帕戈斯岛渡渡鸟的进化树。
    • 非常有意义!那一定是节点继承其集群能力的地方!愚蠢的渡渡鸟宝宝节点!
    猜你喜欢
    • 2014-11-04
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2017-01-06
    • 2017-04-03
    相关资源
    最近更新 更多