gpt4 book ai didi

node.js - 在代理上下文中运行代码

转载 作者:太空宇宙 更新时间:2023-11-03 23:11:03 25 4
gpt4 key购买 nike

我正在试验 Harmony 代理,我想在代理上下文中运行代码,这意味着代码的全局对象将是代理。例如,如果我在代码中调用函数 foo(),它将由代理 get() 方法管理。

但是使用 Proxy.create() 和 vm.runInNewContext() 不起作用,似乎 Proxy 对象被新的上下文对象覆盖并丢失了他的属性。

var vm = require('vm');

var proxy = Proxy.create({
get: function(a, name){
return function(){
console.log(arguments);
}
}
});

vm.runInNewContext("foo('bar')", proxy); // ReferenceError: foo is not defined

有什么办法可以实现我想要做的事情吗?

//编辑

(function() {
eval("this.foo('bar')");
}).call(proxy);

上面的代码运行良好,但我希望能够不使用 this 语句,而直接引用全局上下文。

最佳答案

这可以通过两种方式实现。在 Node 中,我可以通过稍微修改的 contextify 来做到这一点。 Contextify 是一个允许将任意对象转换为全局上下文以类似于 vm 模块运行的模块。它通过创建一个具有命名属性拦截器的全局对象来实现此目的,然后转发对该对象的访问,因此它能够保持引用“事件”,而不是像 Node 的内置虚拟机那样复制属性。我所做的修改是更改它,以便这些访问能够触发正确的代理陷阱,IE 将 ctx->sandbox->GetRealNamedProperty(property) (不会触发代理获取陷阱)更改为 ctx->沙箱->获取(属性)。 has、set 等也有类似的更改。属性枚举不能正常工作(通常在上下文中也不能正常工作),因为处理属性列表的功能(至少对于 getOwnPropertyNames 而言)未向 API 公开。

上下文:https://github.com/brianmcd/contextify我的 fork :https://github.com/Benvie/contextify拉取请求:https://github.com/brianmcd/contextify/pull/23

第二种方法可以通用,但实际上不会产生代理全局。本质上,您为全局中的每个现有对象创建代理,然后在创建的函数内加载所需的代码,该函数将所有属性隐藏为函数参数。像这样的东西:

var globals = Object.getOwnPropertyNames(global);
var proxies = globals.map(function(key){
return forwardingProxy(global[key]);
});
globals.push(codeToRun);
var compiled = Function.apply(null, globals);
var returnValue = compiled.apply(forwardingProxy(global), proxies);

关于node.js - 在代理上下文中运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10884880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com