2011-06-28 60 views
1

每當我運行vm.runInThisContext(code, filename)時,我運行的代碼報告爲__filename__dirnameundefinedNodeJS vm.runInThisContext()和缺少__filename

這也導致了任何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

你的意思是require.paths.unshift => http://stackoverflow.com/questions/5390886/nodejs-require-paths-resolve-problem – Alfred

+1

我沒有觸及任何與需求相關的東西。 – Tower

+0

你的意思是vm.runInThisContext(code,'/ home/full/path/to/file.js')不起作用? – Alfred

回答

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它工作正常!

+0

dwfm不適合我。我只有runInNewContext裏面的另一個函數。 – kchoi