javascript - NodeJS vm.runInThisContext() 和缺少 __filename

标签 javascript node.js

每当我运行 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/

相关文章:

javascript - Meteor升级问题: forgotPwd route configured but showForgotPasswordLink set to false

javascript - 与backbonejs路由器有问题

json - 如何在 Node.js 代理中返回 JSON?

mysql - NodeJS MySQL 将查询与多个模型查询的响应连接到一个 Controller 调用

javascript - Protractor :element.click、element.sendKeys 和来自 browser.debugger 断点的 friend ?

javascript - 使用 D3.js 的分层力图

javascript - 每当我尝试在 VScode 终端中运行 cypress run --record --key xxxx 时,都会收到错误消息

javascript - NodeJS 聊天服务器示例代码

javascript - AngularJs - $location.path 不起作用

email - Express with EJS 能否将 HTML 呈现为变量(以便我可以作为电子邮件发送)?