NodeJS vm.runInThisContext()和缺少__filename

时间:2011-06-28 12:52:36

标签: javascript node.js

每当我运行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不关心第二个参数。

1 个答案:

答案 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它就可以了!