#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. Это происходит, когда либо нет процесса / сервера, прослушивающего указанный порт, либо когда вы пытаетесь подключиться к привилегированному порту без привилегий суперпользователя.