每当我运行vm.runInThisContext(code, filename)
时,我运行的代码都会将__filename
和__dirname
报告为undefined
。
这也会导致任何fs.readFile
和此类调用无法与相对路径一起使用的情况。实际上,即使我向它们提供现有文件的硬编码绝对路径,文件系统功能根本不起作用。
例如,这不会做任何事情:
var fs = require('fs');
fs.readFile('/home/test/file.txt', function(e, data) {
if (e) {throw e;}
console.log('here i am');
});
发生的事情是没有任何反应。如果我在正常的NodeJS代码中运行代码,那么它输出“我在这里”,但如果我通过vm
模块运行该代码,则没有任何反应。简单地从不调用回调,因为由于某种原因它无法找到文件,并且似乎没有任何超时。
如何让Node了解执行的代码是某个“文件”并使fs
模块功能正常工作?我尝试将第二个参数指定为vm.runInThisContext(code, filename)
,但我认为没有区别。它几乎看起来Node不关心第二个参数。
答案 0 :(得分:4)
我不确定我以前是如何让我的代码示例工作的,因为现在它们根本不起作用。
我发现您可以使用vm.runInNewContext(code, sandbox, filename)
,然后在沙盒中指定require
,__filename
以及您需要的任何内容:
// Place here some path to test it. I'm using Cygwin...
var filename = '/cygdrive/z/www/project/src/bootstrap.js';
var code = "var fs = require('fs'); fs.readFile('./path/to/some/file.js', function(e, data) {if (e) {throw e;} console.log(data.toString());});";
var vm = require('vm');
vm.runInNewContext(code, {
require: require,
console: console,
__filename: filename
}, filename);
然后如果我运行node bootstrap.js --debug
它就可以了!