Как использовать модули узлов внутри песочницы VM2

#javascript #node.js #node-vm2

#javascript #node.js #узел-vm2

Вопрос:

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

Вот пример, в котором я вызываю process(); inputData — это { a: 123 } , а userScript будет sampleScript.js показано ниже.

 process(inputData, userScript) {
  const { NodeVM } = require('vm2');
  const vm = new NodeVM({
        console: 'inherit',
        sandbox: { content: inputData },
        require: { external: true },
        wrapper: 'none',
      });
  console.log(vm.run(userScript, 'node_modules'));
}
 

sampleScript.js

 input = content;

function execute(data) {
  data['a'] *= 100;
  const fetch = require('node-fetch');
  await fetch(`webhook.site-endpoint`, {
      method: 'POST',
      body: JSON.stringify(data),
    });
}
execute(input);
 

Я должен ожидать сообщение «12300» на указанной конечной точке. Однако, похоже, что что-то не так с вызовом метода await fetch, поскольку я получаю эту ошибку на своей консоли:

(узел: 36376) Предупреждение о необработанном отказе: Ошибка: подключение ECONNREFUSED 127.0.0.1:80 в TCPConnectWrap.afterConnect [как завершенное] (net.js: 1141:16) (узел: 36376) Предупреждение о необработанном отказе: отклонение необработанного обещания. Эта ошибка возникла либо из-за включения асинхронной функции без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch() . Чтобы завершить процесс узла при отклонении необработанного обещания, используйте флаг CLI --unhandled-rejections=strict (см. https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode ).

Возможно, это просто способ, которым я настроил параметры песочницы, поскольку я не уверен, что я успешно импортировал библиотеку выборки узлов в первую очередь. Любые советы будут оценены!

Комментарии:

1. Порт 80 является привилегированным портом. Вы не можете подключиться к нему без привилегий суперпользователя. Попробуйте подключиться к порту выше 1024.

2. привет, Абрар, как я могу это сделать? Я не очень уверен, как это связано с портом, поскольку я просто отправляю запрос на URL обратного вызова?

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