将上下文从 vm.Script 传递到另一个
Passing context from a vm.Script to another
正在关注 、
我正在 运行使用自定义上下文创建 vm.Script,它提供了 运行 另一个 vm.Script 的方法。
我想将第一个 vm.Script 的上下文传递给第二个 vm.Script。
但是,当我测试以下内容时:
var util = require('util');
var vm = require('vm');
var code1 = 'debug(this);'
+ '(function(val) {'
+ ' this.test = 2;'
+ ' lib.increment();'
+ ' lib.subcall(this);'
+ '})();'
var code2 = 'debug(this);';
var context = {
count: 1,
subcall: function(scope) {
console.log(util.inspect(scope));
var script = new vm.Script(code2);
script.runInNewContext(scope);
}
};
var sandbox = {
context: context,
lib: require('./lib')(context),
debug: function(message) { console.log(util.inspect(message)); }
}
var script = new vm.Script(code1);
script.runInNewContext(sandbox);
lib
模块包含:
module.exports = function(context) {
return {
increment: function() {
context.count++;
},
subcall: function(scope) {
context.subcall(scope);
}
};
};
我在 code2
vm.Script.
中得到一个 ReferenceError (未定义调试)
输出为:
// debug(this) inside code1
{ context: { count: 1, subcall: [Function] },
lib: { set: [Function], increment: [Function], subcall: [Function] },
debug: [Function] }
// console.log inside subcall
{ test: 2,
context: { count: 2, subcall: [Function] },
lib: { set: [Function], increment: [Function], subcall: [Function] },
debug: [Function] }
基本上我希望 运行 第二个代码具有相同的上下文,第一个代码中分配的 test
字段将被添加到其中。
为什么不是这样?
如果你设置
this.debug = debug;
在第 6 行,即在 code1
中的匿名函数内,您可以访问第二个沙箱内的 debug()
。
在我看来 debug()
应该在 code2
中可用。将您的案例添加到此问题可能会很好node#6283。
正在关注
我正在 运行使用自定义上下文创建 vm.Script,它提供了 运行 另一个 vm.Script 的方法。
我想将第一个 vm.Script 的上下文传递给第二个 vm.Script。
但是,当我测试以下内容时:
var util = require('util');
var vm = require('vm');
var code1 = 'debug(this);'
+ '(function(val) {'
+ ' this.test = 2;'
+ ' lib.increment();'
+ ' lib.subcall(this);'
+ '})();'
var code2 = 'debug(this);';
var context = {
count: 1,
subcall: function(scope) {
console.log(util.inspect(scope));
var script = new vm.Script(code2);
script.runInNewContext(scope);
}
};
var sandbox = {
context: context,
lib: require('./lib')(context),
debug: function(message) { console.log(util.inspect(message)); }
}
var script = new vm.Script(code1);
script.runInNewContext(sandbox);
lib
模块包含:
module.exports = function(context) {
return {
increment: function() {
context.count++;
},
subcall: function(scope) {
context.subcall(scope);
}
};
};
我在 code2
vm.Script.
输出为:
// debug(this) inside code1
{ context: { count: 1, subcall: [Function] },
lib: { set: [Function], increment: [Function], subcall: [Function] },
debug: [Function] }
// console.log inside subcall
{ test: 2,
context: { count: 2, subcall: [Function] },
lib: { set: [Function], increment: [Function], subcall: [Function] },
debug: [Function] }
基本上我希望 运行 第二个代码具有相同的上下文,第一个代码中分配的 test
字段将被添加到其中。
为什么不是这样?
如果你设置
this.debug = debug;
在第 6 行,即在 code1
中的匿名函数内,您可以访问第二个沙箱内的 debug()
。
在我看来 debug()
应该在 code2
中可用。将您的案例添加到此问题可能会很好node#6283。