Я настраиваю новый HTTP-сервер для выполнения длинной команды и возврата ответа от этой команды оболочки клиенту.
Я запускаю v4.17.1 Express. При выполнении этой команды время ожидания запросов от клиентов неоднократно истекало. (Я app.use(cors()) если это имеет значение).
app.get("/dl", (req, res) => {
require("child_process").exec("command -url".concat(req.query.url), (err, stdout, stderr) => {
if (err || stderr) res.status(500).send(`err: ${err.message}, stderr: ${stderr}`);
res.status(200).send(stdout);
}
});
Браузеры просто отключаются, когда я пытаюсь запустить эту команду, потому что это занимает ДОЛГОЕ ВРЕМЯ. Если я не могу использовать 102 Processing, это нормально, просто мне нужно другое решение. Спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я бы посоветовал не использовать HTTP 102. Вы можете узнать больше о том, почему: https://softwareengineering.stackexchange.com/a/316211/79958
Я бы также рекомендовал СИЛЬНО против вашей текущей логики, используя параметр запроса. Кто-то может вводить команды, которые будут выполняться на сервере.
"Если я не смогу использовать 102 Processing..."
Не используйте 102 Processing, так как он разработан специально для WebDAV. Пожалуйста, ознакомьтесь с RFC2518 для получения подробной информации.
«Хотелось бы другое решение»
Вы можете вернуть 200 OK вместо GET /dl после получения HTTP-запроса и запуска дочернего процесса, указав: «Эй, клиент, я получил ваш запрос и успешно начал работу»:
app.get("/dl", (req, res) => {
require("child_process").exec("command -url".concat(req.query.url));
res.status(200).end();
});
Затем в дочернем процессе сохраните результат выполнения где-нибудь (в файле, в БД и т. д.) и сопоставьте результат с URL-адресом запроса:
query url A --> child process result A
query url B --> child process result B
query url C --> child process failed information
На стороне клиента, после получения 200 OK для GET /dl запроса, запустите опрос - отправка запроса на сервер каждые 5 секунд (или любой другой временной интервал, который вам нужен), с URL-адресом предыдущего успешного запроса в качестве параметра, пытаясь получить его результат в приведенном выше сопоставлении. . Это было бы: