Как я могу выполнить код, который пользователь вводит в мой редактор ACE на моей странице

Я использую редактор ACE как мой текстовый редактор на моей странице и пользователь будет вводить его код.

  1. Я ищу, чтобы выполнить код, который был введен пользователем или в браузере, если это возможно. Как получить ввод из редактора и использовать с ним компилятор JavaScript браузеров V8?

  2. затем я попытаюсь запустить его на узле.js но сначала я должен узнать Node:).

2 ответов


относительно просто захватить введенный пользователем код и запустить его с помощью JavaScript. По сути, вы получите код от ACE:

var code = editor.getValue();

затем используйте javascript для его запуска. На простейшем уровне вы можете просто сделать:

eval(code);

однако вероятно, не хотите использовать eval(). Вместо этого вы можете сделать что-то вроде:

// grabbed from https://stackoverflow.com/questions/6432984/adding-script-element-to-the-dom-and-have-the-javascript-run
var script = document.createElement('script');
try {
  script.appendChild(document.createTextNode(code));
  document.body.appendChild(script);
} catch (e) {
  script.text = code;
  document.body.appendChild(script);
}

это будет работать. Однако это все равно вызовет некоторые проблемы, так как тогда пользовательский код может повлиять на ваш окружающая среда. В этом случае это может быть не страшно с точки зрения безопасности (если пользователь не может поделиться своим кодом), но это было бы запутанно. По этой причине вы захотите песочница код.

этот ответ объясняет JavaScript на стороне клиента песочницы, используя window.postMessage, вы можете отправить javascript в изолированный iframe и оценить его там.

если вы хотите принести этот сервер и выполнить код узла, вам понадобится заниматься песочницей по-разному. на сервере песочница гораздо больше беспокоит, так как пользователь может сделать намного больше с Javascript и может злонамеренно взаимодействовать с вашим сервером. к счастью, есть несколько песочниц для узла, который должен помочь.


получение кода-это простая часть, просто сделайте code = editor.getValue()
Просто использовать компилятор V8 тоже легко, создайте iframe и сделайте

try {
    var result = iframeWindow.eval(code)
} catch(e) {
    // report error...
}

но это не будет очень полезно, Так как будет очень легко создать бесконечные петли и сломать страницу.
Вы можете взглянуть на https://github.com/jsbin/jsbin/blob/master/public/js/runner/loop-protect.js#L7 для решения проблемы цикла.