Javascript 在vm脚本上下文中传递函数
假设我有一个如下所示的库模块:Javascript 在vm脚本上下文中传递函数,javascript,node.js,v8,Javascript,Node.js,V8,假设我有一个如下所示的库模块: module.exports = { increment: function() { count++; } } (function() { lib.increment(); })(); 我想在动态生成的脚本中使用它,如下所示: module.exports = { increment: function() { count++; } } (function() { lib.increment
module.exports = {
increment: function() {
count++;
}
}
(function() { lib.increment(); })();
我想在动态生成的脚本中使用它,如下所示:
module.exports = {
increment: function() {
count++;
}
}
(function() { lib.increment(); })();
通过在沙箱中传递:
var sandbox = {
count: 1
lib: require('./lib')
}
var script = new vm.Script('(function() { lib.increment() })();');
script.runInNewContext(sandbox);
我遇到的一个明显的问题是,一方面我不能要求“lib”,因为lib.js中没有定义“count”;另一方面,如果我在“lib.js”文件的导出上面定义var count
,那么这个新的count
变量将受到影响,而不是沙箱中的变量
以下是我希望遵守的限制条件:
- 对生成的文件使用vm,而不是eval()或require()
- 在外部文件中定义“lib”
- 不修改自动生成的脚本,因此不使用
或类似工具lib.increment.apply(context)
lib
函数作为字符串进行前置,或者直接在sandbox
对象上定义它们,我发现这是一个不太理想的选项
在
require
调用中似乎没有任何方法可以传递变量的上下文。实现这一点的一种方法是让lib
模块成为一个函数,该函数接受上下文,然后返回正确的接口
lib.js
module.exports = function(context) {
var count = context.count;
return {
increment: function() {
count++;
}
};
};
main.js
var sandbox = {
count: 1
};
sandbox.lib = require('./lib')(sandbox);
var script = new vm.Script('(function() { lib.increment() })();');
script.runInNewContext(sandbox);
为什么不让
exports
成为一个返回带有/get/set&increment方法的对象的函数呢?或者可以让exports成为一个接受上下文的函数。然后您可以执行require('./lib')({count:1})
,它将返回一个带有increment
函数的对象。@MikeC看,这就是为什么您永远不要害怕提问,这实际上是一个很好的建议!global.count++
你想做什么?@Bergi“global”是什么意思?我需要更改在沙盒中作为上下文传递的一个。