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

时间:2012-06-07 15:25:53

标签: javascript node.js module runtime dynamically-generated

我目前正在开发一个node.js项目,该项目需要在运行时和运行时生成和更改内存中的对象。我知道这听起来令人困惑,所以这是一个例子。

周一上午10点:

var PI = Math.PI;

exports.area = function (r) {
   return PI * r * r;
};

周一上午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;
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;
   }
};

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

以下是我的限制:

  • 使用Prototypal Inheritance(无关键字" new")
  • 更改将在下次调用函数
  • 时生效
  • 更改包括添加新变量和函数
  • 需要保存更改才能重新启动服务器
  • 无法使用eval()

我想到了两种可能的策略:

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

    • 优点:能够在服务器运行时执行此操作
    • 缺点:我不确定如何将其保存到文件中。据我所知,我不能在不使用eval()的情况下将函数保存到文件中
  2. 直接编辑文件并通过node-supervisor等方式重新加载文件。

    • 优点:更改将被保存,版本可以保存并还原为
    • 缺点:我认为直接编辑文件会或多或少地使用eval()产生相同的结果,即,如果有人偷偷摸摸了系统可能会破坏的东西。
  3. 我现在所能想到的一切。非常感谢这方面的任何意见或选择。

1 个答案:

答案 0 :(得分:0)

供将来参考:

  • node.js' vm module有几个runInContext()函数,可以有效地沙箱执行并防止访问其范围之外的变量。 a blog entry here讨论了不同版本之间的差异,并提供了基准
  • 还有一个sandbox模块可用于node.js
  • 在沙盒中运行东西的缺点是执行速度慢很多

结论:在沙盒的范围内存储函数并安全地执行它们并非不可能,它只是不太实用。

替代解决方案:如果函数本身不是太复杂,那么以DSL的形式存储调用并不是不可能的,并在之后解析它们。