Javascript NodeJS vm.runInThisContext()和缺少文件名
每当我运行时,我运行的代码都会报告为未定义 这也会导致任何Javascript NodeJS vm.runInThisContext()和缺少文件名,javascript,node.js,Javascript,Node.js,每当我运行时,我运行的代码都会报告为未定义 这也会导致任何fs.readFile调用都无法使用相对路径的情况。实际上,确切地说,文件系统函数根本不起作用,即使我向它们提供了指向现有文件的硬编码绝对路径 例如,这将不起任何作用: var fs = require('fs'); fs.readFile('/home/test/file.txt', function(e, data) { if (e) {throw e;} console.log('here i am'); });
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
模块功能正常工作?我尝试将第二个参数指定为,但没有发现任何区别。看起来Node几乎不关心第二个参数。我甚至不确定我以前是如何让代码示例工作的,因为现在它们根本不工作
我发现您可以使用vm.runInNewContext(code,sandbox,filename)
,然后指定require
、\uu 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就可以了 我甚至不确定我以前是如何让代码示例工作的,因为现在它们根本不工作 我发现您可以使用
vm.runInNewContext(code,sandbox,filename)
,然后指定require
、\uu 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就可以了 你是说require.path.unshift=>我没有涉及任何与requires相关的内容。你是说vm.runInThisContext(code,/home/full/path/to/file.js)不起作用??是的,如果现在使用
code
文件名或全局文件名,它们将等于未定义的。这也会在使用相对路径时中断文件系统功能。你是说require.paths.unshift=>我没有触及任何与requires相关的内容。你是说vm.runinthiscoxt(code,/home/full/path/to/file.js)不起作用??是的,如果code
现在使用\uu filename
或global.\uu filename
,它们将等于未定义的。当使用相对路径时,这也会中断文件系统功能。dwfm对我不起作用。我只有在另一个函数中运行InNewContext。dwfm对我不起作用。我只有在另一个函数中运行InNewContext。