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

标签 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;
   }
};
<小时/>

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

以下是我的限制:

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

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

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

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

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

目前我能想到的就这些了。将不胜感激这方面的任何意见或选择。

最佳答案

供将来引用:

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

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

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

关于javascript - node.js 并在运行时/期间生成模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10934883/

相关文章:

javascript - 是否可以使用 JavaScript 隐藏 PDF 文档中的页面?

javascript - 如何分析我的 Node 应用程序以查看我在哪里用完了内存和 CPU 资源?

module - 如何创建返回 DB2 模块中的表的用户定义函数?

javascript - 在 JavaScript 中格式化使用数组生成的表

javascript - Jquery 中没有从 php json_encode 接收到数据

javascript - 管理 package.json 的简单方法

javascript - NodeJS - 在 Windows 上解析另一个 JSON 中的 JSON 字符串时出现问题

generics - 无法定义 'a->' b 函数列表

javascript - 变量被意外覆盖

javascript - 拦截 Angular $http 中的服务器错误并拒绝 Promise