Node.js nodejs:是否可以使用runInNewContext评估js代码,并通过超时限制其执行时间?
我希望使用node.js中的runInNewContext执行不受信任的js代码,但据我所知,没有办法限制其执行时间。它也是一种同步操作。有没有一种方法可以设置它的超时或异步版本,从而允许我从“外部”控制它的执行 更新:在外部进程中运行不好:Node.js nodejs:是否可以使用runInNewContext评估js代码,并通过超时限制其执行时间?,node.js,Node.js,我希望使用node.js中的runInNewContext执行不受信任的js代码,但据我所知,没有办法限制其执行时间。它也是一种同步操作。有没有一种方法可以设置它的超时或异步版本,从而允许我从“外部”控制它的执行 更新:在外部进程中运行不好: 需要太多的资源 更重要的是,我需要代码通过沙盒环境访问我的数据/代码 使用或在外部进程中运行脚本,如果达到超时,则设置截止时间计时器并终止进程;如果脚本完成,则设置计时器 我想在中使用runInNewContext执行不受信任的js代码 但是据我所知,没
- 需要太多的资源
- 更重要的是,我需要代码通过沙盒环境访问我的数据/代码
现在这是可能的,因为我向节点
vm
模块添加了timeout
参数支持。您只需将毫秒超时值传递给runInNewContext()
,如果代码未在指定的时间内完成执行,它将引发异常
注意,这并不意味着运行不可信代码的任何类型的安全模型。这只允许您对您信任或安全的代码进行超时
var vm = require("vm");
try {
vm.runInNewContext("while(true) {}", {}, "loop", 1000);
} catch (e) {
// Exception thrown after 1000ms
}
console.log("finished"); // Will now be executed
正是您所期望的:
$ time ./node test.js
finished
real 0m1.069s
user 0m1.047s
sys 0m0.017s
这种做法违背了目的。我想运行很多这样的程序,我当然不想为每个客户端运行一个系统进程。此外,我确实需要通过沙盒环境提供对内部函数的访问。如果它是受信任的非阻塞代码,则在输入任何处理程序时检查计时器标志,并执行处理程序的回调传递“超时”错误。如果您不能信任代码,那么外部进程是唯一的选择。您不必为每个远程呼叫启动进程,我认为这不是问题