如何在Node.js中精细管理隔离范围?

时间:2018-06-24 04:00:53

标签: javascript node.js

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

main.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"

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

isolated.js

module.exports = {
    eval: ???
}

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

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我有一种有点棘手的方法来解决此问题,但它可能对您有用。您可以让一个声明一个变量/函数的函数,而另一个调用以前声明的变量/函数的函数,而不是单独隔离一个eval函数。您可以在调用函数中附加到eval的本地字典中跟踪声明。像这样:

isolated.js

var isolatedFunctions = {};

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

module.exports.call = function (strCall) {
    return eval(`(isolatedFunctions.${strCall})`);
}

然后您将像这样使用它:

main.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"

对此有一些明显的限制,主要是您必须对调用函数的方式非常具体,因为为了容纳参数的可能性,它仅在“ isolatedFunctions”之前添加了。在eval通话中。

很可能有一种更好的方法来完成您要寻找的东西,但是我认为如果满足您的需求,我会分享这种可能性。