将上下文从vm.Script传递到另一个

时间:2016-07-16 15:08:59

标签: javascript node.js v8

关注this question

我正在运行带有自定义上下文的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字段将被添加到其中。

为什么不是这样?

1 个答案:

答案 0 :(得分:1)

如果您设置

this.debug = debug;

在第6行中

,即在code1中的匿名函数内,您可以访问第二个沙箱中的debug()

在我看来debug()应该可以使用code2。可以将您的案例添加到此问题node#6283