如何在nodejs中精细管理隔离的范围?



我正在尝试在javascript中有一个范围,我可以在其中运行代码,并且对我的本地范围没有可见性。

主.js

const isolated = require('./isolated.js');
function f() {return "a";} // invisible by the isolated scope
isolated.eval('function f() {return "b";}'); // invisible by my local scope
let b = isolated.eval("f();"); // I could get the result however
console.log(b); // "b"

带有模块的解决方案将是完美的。但这甚至可能吗?

隔离.js

module.exports = {
eval: ???
}

到目前为止,我最好的选择是生成一个临时文件,使用 process.fork(( 执行它并从日志文件中获取结果。但我正在寻找一种轻量级的东西,我的main.js可以很好地控制它。

非常感谢您的帮助!

我有一个有点笨拙的方法来解决这个问题,但它可能适合您的目的。与其隔离单个 eval 函数,不如让一个函数声明变量/函数,另一个调用之前声明的变量/函数。可以在调用函数中追加到 eval 的本地字典中跟踪声明。像这样:

隔离.js

var isolatedFunctions = {};
module.exports.declare = function(strName, strContents) {
isolatedFunctions[strName] = eval(`(${strContents})`);
}
module.exports.call = function (strCall) {
return eval(`(isolatedFunctions.${strCall})`);
}

然后,您将像这样使用它:

主.js

const isolated = require("./isolated.js");
function f() { return "a" }
isolated.declare ("f", "function() { return 'b' }");
var b = isolated.call("f()");
var a = f(); 
console.log(a); // Outputs "a"
console.log(b); // Outputs "b"

这有一些明显的限制,主要是你必须非常具体地调用函数的方式,因为为了适应参数的可能性,它只是在eval调用中加上"isolatedFunctions."。

很可能有更好的方法来完成您正在寻找的东西,但我想我会分享这种可能性,以防它适合您的需求。

最新更新