1

我目前正在开发一个 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;
   }
};

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

以下是我的限制:

  • 使用原型继承(没有关键字“new”)
  • 更改在下次调用函数时生效
  • 更改包括添加新变量和函数
  • 需要保存更改以重新启动服务器
  • 无法使用 eval()

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

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

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

    • 优点:更改将被保存,版本可以保存并恢复到
    • 缺点:我认为使用 eval() 直接编辑文件或多或少会产生相同的后果,即,如果有人偷偷溜出恶意软件,系统可能会崩溃。

这就是我现在能想到的。将不胜感激这方面的任何意见或选择。

4

1 回答 1

0

备查:

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

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

于 2012-06-09T16:20:59.530 回答