再次回到另一个繁琐的问题。如果我在问题解释之前解释上下文会更容易。我正在尝试构建一个项目(在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());
看来运行的代码只能访问我复制到沙箱中的数据库。这不是我想要的,我希望它访问它在第一个运行时具有的相同数据库。关于我怎么做的任何建议?
答案 0 :(得分:0)
顾名思义,vm.runInNewContext
每次调用时都会创建不同的上下文。所以不要使用它!相反,请使用vm.createContext
(仅限一次)vm.runInContext
。您需要维护对context
返回的createContext()
的引用。