0

又回来了另一个乏味的问题。如果我在问题之前解释上下文会更容易。我正在尝试构建一个项目(在 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());

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

4

1 回答 1

0

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

于 2013-09-03T17:39:21.057 回答