返回的Javascript VM对象有错误的引用?

时间:2013-09-03 17:34:11

标签: javascript node.js function

再次回到另一个繁琐的问题。如果我在问题解释之前解释上下文会更容易。我正在尝试构建一个项目(在Node.JS中),它允许你通过“输入”从内部编程自己(这可能是网络/控制台或其他任何东西,但我们假设通过控制台为此)。

所以让我们假设我们有一个对象:

var database = {
    'test': 123
}

现在从控制台输入:

;database.myFunc = function() { return database.test; }

我使用vm.runInContext运行它,然后将其复制回数据库对象(需要沙箱,因为它是运行它的非特权用户)。这很好用,在下一个命令中执行代码时工作正常:

;database.myFunc()
=> 123

到目前为止一切顺利。现在,在这一点上,我构建了自己的对象转储器,可以将函数导出为字符串(var str = new String(database.myFunc)),它可以工作并将它们导出为字符串。

当我从文件导入代码时会出现此问题。我尝试过这样的代码:

code = "retval = " + data.toString();
sandbox = vm.createContext({
    "database": sb.database
});
result = vm.runInNewContext(code, sandbox);
sb.database = result;
console.log(sb.database.myfunc());

看来运行的代码只能访问我复制到沙箱中的数据库。这不是我想要的,我希望它访问它在第一个运行时具有的相同数据库。关于我怎么做的任何建议?

1 个答案:

答案 0 :(得分:0)

顾名思义,vm.runInNewContext每次调用时都会创建不同的上下文。所以不要使用它!相反,请使用vm.createContext(仅限一次)vm.runInContext。您需要维护对context返回的createContext()的引用。