Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js nodejs:是否可以使用runInNewContext评估js代码,并通过超时限制其执行时间?_Node.js - Fatal编程技术网

Node.js nodejs:是否可以使用runInNewContext评估js代码,并通过超时限制其执行时间?

Node.js nodejs:是否可以使用runInNewContext评估js代码,并通过超时限制其执行时间?,node.js,Node.js,我希望使用node.js中的runInNewContext执行不受信任的js代码,但据我所知,没有办法限制其执行时间。它也是一种同步操作。有没有一种方法可以设置它的超时或异步版本,从而允许我从“外部”控制它的执行 更新:在外部进程中运行不好: 需要太多的资源 更重要的是,我需要代码通过沙盒环境访问我的数据/代码 使用或在外部进程中运行脚本,如果达到超时,则设置截止时间计时器并终止进程;如果脚本完成,则设置计时器 我想在中使用runInNewContext执行不受信任的js代码 但是据我所知,没

我希望使用node.js中的runInNewContext执行不受信任的js代码,但据我所知,没有办法限制其执行时间。它也是一种同步操作。有没有一种方法可以设置它的超时或异步版本,从而允许我从“外部”控制它的执行

更新:在外部进程中运行不好:

  • 需要太多的资源
  • 更重要的是,我需要代码通过沙盒环境访问我的数据/代码

使用或在外部进程中运行脚本,如果达到超时,则设置截止时间计时器并终止进程;如果脚本完成,则设置计时器

我想在中使用runInNewContext执行不受信任的js代码 但是据我所知,没有办法限制它的执行 时间它也是一种同步操作。有没有办法设置超时时间 它或它的异步版本,允许我控制它的执行 从外面来

我认为你说的完全正确。我认为唯一的选择是用一个词来填充一个问题。希望他/他们能想出一些聪明的办法,或者可能会告诉你这是不可能的

发件人:

请注意,运行不受信任的代码是一项棘手的工作,需要进行大量的测试 照顾为防止意外的全局变量泄漏, vm.runInNewContext非常有用,但是可以安全地运行不受信任的代码 需要一个单独的过程

所以,为了安全地执行此操作,您需要在外部程序中运行。我认为“昂贵的部分”可以通过以下方式避免

单个控制流程负责启动子流程 他们倾听联系,并在他们到达时为他们服务。阿帕奇 始终尝试维护多个备用或空闲的服务器进程 随时准备为收到的请求提供服务。这样,客户机就不会 需要等待一个新的子进程被分叉,然后才能执行它们的 请求可以得到满足


现在这是可能的,因为我向节点
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

这种做法违背了目的。我想运行很多这样的程序,我当然不想为每个客户端运行一个系统进程。此外,我确实需要通过沙盒环境提供对内部函数的访问。如果它是受信任的非阻塞代码,则在输入任何处理程序时检查计时器标志,并执行处理程序的回调传递“超时”错误。如果您不能信任代码,那么外部进程是唯一的选择。您不必为每个远程呼叫启动进程,我认为这不是问题