在单独的上下文中运行 js 代码并访问其全局变量
Run js code in a separate context and access its global variable
我想在节点中运行一个第三方JavaScript文件(我对它的内容没有太多控制权),并在其上下文中访问该文件代码创建的全局变量。
我考虑了两件事:
-
在
vm
沙盒中运行代码。问题是我不知道如何正确创建上下文,因为vm.createContext([sandbox])
不会自动为我要运行的脚本提供基本内容,例如console
或require
或任何内容。这有点令人沮丧,因为文档明确指出(强调我的):
如果给定一个沙盒对象,则将"上下文化"该沙箱,以便它可以用于调用vm.runInContext()或script.runInContext()。在脚本中以这种方式运行,沙盒将是全局对象,保留其所有现有属性,但也具有任何标准全局对象具有的内置对象和函数。
什么是"任何标准全局对象具有的内置对象和函数"?我天真地假设它是像
console
,process
,require
等。但如果是这样,API 将不起作用,因为这些未设置。我可能在这里误解了什么。var sandbox = vm.createContext({foo: 'foo'}); var code = 'console.log(foo);'; vm.runInContext(code, sandbox);
这导致:
评估机:1
console.log(foo);
^ 引用错误:未定义控制台 -
在子进程中运行代码。但是我找不到任何有关访问子进程的全局变量的文档。我假设与子进程通信的唯一方法是通过消息传递,但即使这样似乎也是从父级到子级,而不是相反......
基本上,我被困住了。哈尔普。
您可以将高级虚拟机/沙盒用于 Node.js
var VM = require('vm2').NodeVM; // https://github.com/patriksimek/vm2#nodevm
var options = {
console: 'inherit',
sandbox: {
foo: 'foo'
}
}
vm = new VM(options);
var code = `
console.log(foo);
oldFoo = foo;
foo = Math.random();
`;
vm.run(code);
console.log(vm.context.oldFoo, vm.context.foo);
在上下文中传递父级console
怎么样?
const vm = require('vm');
var sandbox = {
console: console
};
var context = new vm.createContext(sandbox);
var script = new vm.Script('console.log("foo")');
script.runInContext(context);
在此代码中,我们可以发送任何响应,并且可以访问具有全局函数的全局变量,并且可以访问从 VM 沙箱返回的整个数据。
function compiler(){
let add = x*y
Return (add);
}
compiler();
const vm = new NodeVM({
sandbox: {
Return(data) {
console.log('Data:', data);
},
x : 10,=
y : 20
},
require: {
external: true,
builtin: ["fs", "path"],
root: "./",
mock: {
fs: {
readFileSync() {
return "Nice try!";
}
}
}
}
});
try {
vm.run(req.query.code);
} catch (error) {
console.log("error: ", error);
}
相关文章:
- 必需的代码无法访问主代码
- 如何创建更好的方式来维护基于我的代码访问的最后一个页面
- 分析云代码访问对象
- PHP未通过javascript代码访问会话变量集
- 我无法使用我的 JavaScript 代码访问 css 样式.我的代码有什么问题
- 从“”中运行的代码访问变量;eval”;在Javascript中
- 从javascript代码访问文件
- 如何使用PHP代码访问javascript变量
- 通过Javascript从后台代码访问全局静态变量
- 在rollup中通过javascript代码访问Selenium IDE变量
- Parse.com云代码访问子对象_type
- 为什么不能'我'getData'函数可以被我的代码访问
- 是否有可能从不同页面中的代码访问java脚本数据?
- jQuery.remove(),分离DOM元素,但我仍然可以从代码访问元素.如何避免泄漏
- 不能从后面的代码访问动态创建的html元素
- 如何从后面的代码访问这些动态创建的控件?
- 我如何在我的qt代码访问javascript变量值
- 如何从script#代码访问html函数
- asp.net Kendoui无法从代码访问网格
- Ajax代码访问隐藏或非公共html或php页面