我目前正在开发一个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()
我想到了两种可能的策略:
使用.prototype,继续添加/更改函数和变量。
- 优点:能够在服务器运行时完成
- 缺点:我不知道如何将其保存到文件。据我所知,如果不以某种方式使用 eval() ,我无法将函数保存到文件
直接编辑文件并通过类似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/