我想在node.js中使用runInNewContext执行不受信任的js代码,但据我所知,无法限制其执行时间。它也是一个同步操作。有没有办法设置它的超时或它的异步版本,这将允许我从“外部”控制它的执行?
更新:在外部流程中运行并不好:
答案 0 :(得分:1)
使用dnode或child_process.fork在外部进程中运行脚本,设置截止时间计时器并在达到超时时终止进程,或者在脚本完成时设置计时器。
答案 1 :(得分:0)
我想使用runInNewContext执行不受信任的js代码 node.js但据我所知,没有办法限制它的执行 时间。它也是一个同步操作。有没有办法设置超时 它或它的异步版本,将允许我控制其执行 从'外面'?
我认为你说的是完全正确的。我认为唯一的选择是填写Joyent/Ryan Dahl的问题。希望他/他们可以提出一些聪明的东西,或者可能会告诉你这是不可能的。
请注意,运行不受信任的代码是一件非常棘手的事情 关心。为防止意外的全局变量泄漏, vm.runInNewContext非常有用,但可以安全地运行不受信任的代码 需要一个单独的过程。
所以要安全地执行此操作,您需要在外部程序中运行。我认为preforking可以避免“昂贵的部分”。
单个控制进程负责启动子进程 当他们到达时,他们会听取连接并为他们提供服务阿帕奇 总是试图维护几个备用或空闲的服务器进程 随时准备服务于传入的请求。通过这种方式,客户不会 需要等待一个新的子进程在他们之前分叉 请求可以提供。
答案 2 :(得分:-2)
现在可以这样做,因为我向节点timeout
模块添加了vm
参数支持。您可以简单地将毫秒超时值传递给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