Почему время ожидания рекурсивных функций в модуле песочницы vm2 узла? - PullRequest
0 голосов
/ 01 сентября 2018

Я создаю веб-приложение, которое позволяет пользователям состязаться друг с другом в решении задач кодирования. Проблема, с которой я постоянно сталкиваюсь, заключается в том, что когда пользователи отправляют какой-либо рекурсивный код для тривиальной проблемы, такой как «fibonacci», код оказывается в песочнице. Из-за этого пользователи не могут использовать рекурсию для решения проблем, которые не слишком велики.

Вот пример того, как я в настоящее время использую vm2 для запуска пользовательского кода вместе с тестами, которые идут с ним.

const {VM} = require('vm2');

const vm = new VM({
  timeout: 3000,
  sandbox: {}
});

let execute = (code, tests) => {
  return new Promise(resolve => resolve(vm.run(`${code} ${tests}`)))
};

Я не понимаю, почему нормальный javascript работает нормально, но когда рекурсивная функция вызывается в "vm.run", это приводит к тайм-ауту.

Я предполагаю, что, возможно, стек вызовов не работает так, как я намереваюсь сделать это внутри функции "run"?

Так же, как дополнительный источник информации, данные JSON для этой конкретной задачи выглядят так:

{
  "body": "Write a function fibonacci that takes an integer n and returns the nth number of the fibonacci sequence. DO NOT USE RECURSION. Code must run in O(n) time.",
  "solution": "function fibonacci(n) {\n\n}",
  "tests": "[typeof fibonacci === 'function', typeof fibonacci(3) === 'number', fibonacci(0) === 0, fibonacci(1) === 1, fibonacci(2) === 1, fibonacci(3) === 2, fibonacci(10) === 55, fibonacci(20) === 6765, fibonacci(40) === 102334155]",
  "testDescriptions": "[\"fibonacci should be a function\", \"fibonacci should return a number\", \"the 0th fibonacci number is 0\", \"the 1st fibonacci number is 1\", \"the 2nd fibonacci number is 1\", \"the 3rd fibonacci number is 2\", \"the 10th fibonacci number is 55\", \"the 20th fibonacci number is 6765\", \"the 40th fibonacci number is 102334155\"]",
  "title": "Fibonacci"
}

Это, наверное, что-то простое, что я не совсем понимаю, но это программирование.

Любая помощь или понимание будет принята с благодарностью, спасибо!

...