如果我有一个包含源代码的字符串
var code = "console.log('I\'ve been loaded.');";
并希望在Node中运行它,通常建议使用
vm.runInThisContext(code, "NOT_A_FILE.mycode");
在代码变得更复杂之前,这一切都很好:
var code2 = "require('http');\n" +
"console.log(http);" // TODO make more useless
在这种情况下,我们无法在vm
中运行code2,因为它不会让模块具有require()
功能,因为vm只是一个V8 VM,而不是节点之一。
这是我到目前为止遇到的唯一问题 - 但我不知道其他问题可能会在未来发生。
所以,从根本上说,我的问题是:require()
在制作Node模块时有哪些额外的功能,以及如何确保我的“字符串”模块具有此功能?如果我需要这个功能,我最好只制作临时文件,我实际上是require()
?
答案 0 :(得分:0)
请vm.runInNewContext
而不是vm.runInThisContext
,然后在沙盒中运行它,您可以传递require对象!多数民众赞成......
var vm = require('vm');
var code2 = "var http = require('http');\n" + "console.log(http);" //TODO make more useless
vm.runInNewContext(code2, {
require: require,
http: require('http'),
console: console
}, 'yourvmfilename1');
或者你可以直接发送http对象。
var vm = require('vm');
var code3 = "console.log(http);" //TODO make more useless
vm.runInNewContext(code3, {
http: require('http'),
console: console
}, 'yourvmfilename2');