Javascript node.js并在运行时/运行期间生成模块

Javascript node.js并在运行时/运行期间生成模块,javascript,node.js,module,runtime,dynamically-generated,Javascript,Node.js,Module,Runtime,Dynamically Generated,我目前正在从事一个node.js项目,该项目要求在运行时和运行期间生成和更改内存中的对象。我知道这听起来很混乱,所以这里有一个例子 星期一上午10点: var PI = Math.PI; exports.area = function (r) { return PI * r * r; }; var PI = Math.PI; var minSize = 15; var error['eng'] = "Error: Minimum size of " + minSize + "not m

我目前正在从事一个node.js项目,该项目要求在运行时和运行期间生成和更改内存中的对象。我知道这听起来很混乱,所以这里有一个例子

星期一上午10点:

var PI = Math.PI;

exports.area = function (r) {
   return PI * r * r;
};
var PI = Math.PI;
var minSize = 15;
var error['eng'] = "Error: Minimum size of " + minSize + "not met.";    
var error['chn'] = "錯誤:不符合最小尺寸:" + minSize + "。"    

exports.area = function (r) {
   if (r >= minSize) {
      return PI * r * r;
   } else {
      return error;
   }
};

exports.circumference = function (r) {
   if (r >= minSize) {
      return 2 * PI * r;
   } else {
      return error;
   }
};
星期一上午11时:

var PI = Math.PI;
var minSize = 10;

exports.area = function (r) {
   if (r >= minSize) {
      return PI * r * r;
   } else {
      return "Error: Minimum size not met.";
   }
};
星期一中午12点:

var PI = Math.PI;
var minSize = 10;
var msg = "Error: Minimum size of " + minSize + "not met.";    

exports.area = function (r) {
   if (r >= minSize) {
      return PI * r * r;
   } else {
      return msg;
   }
};
星期二上午10点:

var PI = Math.PI;

exports.area = function (r) {
   return PI * r * r;
};
var PI = Math.PI;
var minSize = 15;
var error['eng'] = "Error: Minimum size of " + minSize + "not met.";    
var error['chn'] = "錯誤:不符合最小尺寸:" + minSize + "。"    

exports.area = function (r) {
   if (r >= minSize) {
      return PI * r * r;
   } else {
      return error;
   }
};

exports.circumference = function (r) {
   if (r >= minSize) {
      return 2 * PI * r;
   } else {
      return error;
   }
};

这是一个有点做作的例子,因为我知道,通过适当的计划,大部分的变化都可以避免,但这有点说明了这一点。该模块在变量和函数方面不断变化,在服务器运行时不断扩展

以下是我的限制:

  • 使用原型继承(无关键字“new”)
  • 更改在下一次调用函数时生效
  • 更改包括添加新的变量和函数
  • 需要保存更改以重新启动服务器
  • 无法使用eval()
我想到了两种可能的策略:

  • 使用.prototype,继续添加/更改函数和变量

    • 优点:能够在服务器运行时执行此操作
    • 缺点:我不知道如何保存到文件。据我所知,如果不以某种方式使用eval(),我无法将函数保存到文件中
  • 直接编辑文件并通过类似的方式重新加载它们

    • 优点:更改可以保存,版本可以保存并恢复到
    • 缺点:我认为使用eval()直接编辑文件或多或少会产生相同的后果,即,如果有人潜入恶意内容,系统可能会破坏
  • 这就是我现在能想到的。如果您对此有任何意见或选择,我们将不胜感激。

    供将来参考:

    • 有几个函数可以有效地沙箱执行,并防止访问其范围之外的变量。有一种方法讨论了不同版本之间的差异,并提供了基准
    • node.js还提供了一个模块
    • 在沙箱中运行东西的缺点是执行速度要慢得多
    结论:在沙箱中存储函数并安全地执行它们并非不可能,只是不太实用

    另一种解决方案:如果函数本身不是太复杂,那么以a的形式存储调用并在以后重新解析它们也不是不可能的