2016-07-16 4 views
0

После this question,Передача контекста из vm.Script других

Я бег 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); 
     } 
    }; 
}; 

Я получаю ReferenceError (отладка не определен) внутри 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 поля, заданное в первом коде.

Почему это не так?

+0

Где вы называете 'code2'? – user835611

+0

@ user835611 в 'subcall'. Я также понял, что этот код имеет другой результат в Windows и * nix. –

ответ

1

Если вы установили

this.debug = debug;

в строке 6, то есть, внутри анонимной функции в code1, у вас есть доступ к debug() внутри второй песочницы.

Мне кажется, что debug() должен быть доступен в code2. Возможно, вы добавите свое дело в этот выпуск node#6283.

Смежные вопросы