Что является альтернативой модулю домена Node.js?
domain
встроенный модуль будет устаревшим:
Стабильность: 0 - Устаревший
Этот модуль ожидает отмены. После того, как API-интерфейс замены был завершен, этот модуль будет полностью устарел. У большинства конечных пользователей не должно быть причин использовать этот модуль. Пользователи, которые абсолютно должны обладать функциональностью, предоставляемой доменами, могут на это рассчитывать, но в будущем они должны будут перейти к другому решению.
В соответствии с этим они в настоящее время не рекомендуют решение. Но как реализовать функциональность, похожую на нижнюю:
var d = require('domain').create();
d.on('error', function(err) {
console.log(err);
});
d.run(function() {
setTimeout(function () {
throw new Error("Something went really wrong in async code.");
}, 1000);
});
Итак, это обрабатывает ошибки, исходящие из асинхронных файлов, но модуль domain
устарел.
Как перенести этот код на что-то лучше?
Мой случай использования заключается в том, что я пишу библиотеку, которая принимает функцию как входную, и она запускает функцию и отображает результат (на самом деле, вы можете думать о ней как об модульной библиотеке):
myLib.it("should do something", function (done) {
setTimeout(function () {
// Some async code
// ...
// But here an error is thrown
throw new Error("dummy");
}, 1000);
});
Очевидно, что я не хочу разбивать процесс в этом случае, но я хочу показать хорошую ошибку (так что в основном поймать ошибку в этой функции).
В настоящее время в библиотеке я делаю:
var err = null;
try {
fn(callback);
} catch (e) {
err = e;
}
console.log(err || "Everything went correctly");
Ответы
Ответ 1
Поскольку вы действительно проблема, очевидно, что, как защитить свой сервер от кода, предоставленного пользователем, вам нужно будет получить код, предоставленный пользователем, из основного процесса и в изолированной среде, которая не может делать плохие вещи на вашем сервере или файловой системы сервера. Я предлагаю вам начать с vm
module, но даже тогда есть много возможностей прочитать о том, как защитить вашу систему.
Вы также можете быть заинтересованы в vm2
module, который добавляет некоторые дополнительные функции безопасности поверх модуля vm
.
Некоторые связанные статьи:
Безопасная песочница и выполнить представленный пользователем JavaScript?
Как безопасно запускать написанные пользователем сценарии в песочнице node.js?
Nifty Javascript Sandbox для node.js
Node.js Использование виртуальной машины (vm)
Использование Docker to Sandbox Untrusted Node JS Code
Если вы просто пытаетесь поймать ошибки в любом коде, который был предоставлен вам разработчиком, почти все, что вы можете сделать, это попробовать/поймать все, что вы звоните из внешнего мира.
Если у стороннего кода есть ошибки в асинхронном коде, они не будут появляться на любом верхнем уровне, поэтому вы ничего не можете с ними поделать. Вы также не можете помешать этому стороннему коду утечка ресурсов (например, дескрипторы файлов, память и т.д.).
В принципе, если вы собираетесь запустить сторонний код в своем процессе, вам нужно верить, что он хороший код, хорошо написан, не течет, обрабатывает свои собственные ошибки и не пытается делать вредоносные вещи. Если вы не можете доверять всем этим вещам, тогда он должен быть запущен в песочнице, где у вас есть еще несколько защит.
Ответ 2
Из всего, что я понимаю, нет замены для domain
. Также есть две основные попытки заменить его функциональными возможностями:
- AsyncWrap, который отслеживает контекст, но не отображается непосредственно в userland
- увеличивайте уровень отладки, используя
v8
и инструменты Chrome Dev, см. здесь
Кроме того, используя vm
звуки, подходящие для вашего случая.