38. 旧vmモジュールのダメな例
var vm = require('vm');
var sandbox = Object.create({foo: 'hoge'});
var ret = vm.runInNewContext('foo;', sandbox);
console.log(ret); // Reference Error
var vm = require('vm');
var sandbox = {foo: 'hoge'};
var ret = vm.runInNewContext('this;', sandbox);
console.log(ret); // {} が返る
var vm = require('vm');
var code = "setTimeout(function(){foo = 1}, 2000);";
var sandbox = {foo: 'hoge', setTimeout: setTimeout};
var ret = vm.runInNewContext(code, sandbox);
setInterval(function() {
console.log(sandbox.foo); // 2秒後以降もhoge
}, 500);
prototypeが継承されない
this が {} オブジェクトに
非同期の変更に追従しない
39. 新vmモジュール
• node_contextfy モジュールをベースにコアに
取り込み。
• 完全に V8::Context を分離。
• 先の不具合を解消。
• WatchDogを導入、timeout 指定も可能に。
var vm = require('vm');
var opts = {timeout: 100};
try {
var ret = vm.runInNewContext('while(true){}', {}, opts);
} catch(e) {
console.log(e);
}