节点VM - 第一级上的require()OK,第二级上失败

时间:2015-03-01 01:10:11

标签: javascript node.js

所以我试图使用Node的VM动态加载生成对象的外部脚本。该对象是三个原型深(祖父母 - >父母 - >儿童)。

如果所有三个原型都在同一个文件中,那么一切正常。

使用 child.js parent-grandparent.js ,两个文件中的一切正常。我将“module”和“require”添加到我的VM沙箱中,并提供自定义的requireShim,并看到它正确触发... child.js 正确请求 parent-grandparent.js 一切正常。

但是,使用3个单独的文件时它不起作用。 child.js 仍通过requestShim正确请求 parent.js ,但在下一级别 parent.js 忽略提供的填充程序并使用内部require()for grandparent.js 直接(由于某种原因永远找不到文件)(由于某种原因,只有当所有文件都在应用程序的根文件夹中时才有效,拒绝处理子目录)

这是我的VM代码。它运行外部脚本,并期望在结果中找到新对象。

app.js

var child = getScriptObject("./scripts/child.js")

function getScriptObject(scriptFilename)
    {
    var sandbox = { "module": module, "result": false, 
                    "require":requireShim, "console":console };

    var script = vm.createScript( fs.readFileSync(scriptFilename) );
    script.runInNewContext(sandbox);
    return sandbox.result;
    }

function requireShim (x)
    {
    console.log("requireShim: "+x);
    return require(x);
    }

grandparent.js

function Grandparent() {};
module.exports = Grandparent

parent.js

console.log("Parent requiring Grandparent...");
var Grandparent = require('./scripts/grandparent.js');

function Parent() { Grandparent.call(this); };
Parent.prototype = Object.create(Grandparent.prototype);    
Parent.prototype.constructor = Parent;

module.exports = Parent

child.js

console.log("Child requiring Parent...");
var Parent = require('./scripts/parent.js');

function Child() { Parent.call(this); };
Child.prototype = Object.create(Parent.prototype);  
Child.prototype.constructor = Child;

result = new Child();

使用以下输出:

Child requiring Parent...
requireShim: ./scripts/parent.js
Parent requiring Grandparent...

module.js:322
    throw err;
          ^
Error: Cannot find module './scripts/grandparent.js'
    at Function.Module._resolveFilename (module.js:320:15)
    at Function.Module._load (module.js:262:25)
    at Module.require (module.js:349:17)
    at require (module.js:368:17)
    at Object.<anonymous> (C:\RemHaz2\zone\scripts\parent.js:2:19)
    at Module._compile (module.js:444:26)
    at Object.Module._extensions..js (module.js:462:10)
    at Module.load (module.js:339:32)
    at Function.Module._load (module.js:294:12)
    at Module.require (module.js:349:17)

请注意,Child-&gt; Parent工作正常,但是Parent-&gt;祖父母忽略了垫片,并且由于某些无法解释的原因无法处理子目录。

1 个答案:

答案 0 :(得分:1)

如果parent.jschild.js位于同一目录中,则:

var Parent = require('./scripts/parent.js');

应该是:

var Parent = require('../scripts/parent.js');

或者:

var Parent = require('./parent.js');

同样地:

var Grandparent = require('./scripts/grandparent.js');

"./scripts/child.js"中的app.js作为app.js工作,而scripts目录的兄弟是共享相同的父目录。