Подтвердить что ты не робот

Что является альтернативой модулю домена 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");
4b9b3361

Ответ 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 звуки, подходящие для вашего случая.