每当我运行 vm.runInThisContext(code, filename)
,我运行的代码报告 __filename
和 __dirname
作为未定义
。
这也会导致任何 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 理解执行的代码是一些"file",并使 fs
模块功能正常工作?我尝试将第二个参数指定为 vm.runInThisContext(code, filename)
,但我看不出有什么区别。看起来 Node 几乎不关心第二个参数。
最佳答案
我什至不确定我以前是如何让我的代码示例工作的,因为现在它们根本不起作用。
我发现你可以使用 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
它工作正常!
关于javascript - NodeJS vm.runInThisContext() 和缺少 __filename,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6506710/