Как отправить 102 Обработка в Экспресс? - PullRequest
0 голосов
/ 12 июня 2019

Я настраиваю новый 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, это нормально, просто я хотел бы другое решение. Спасибо!

Ответы [ 2 ]

1 голос
/ 12 июня 2019

«Если я не могу использовать 102 Обработка ...»

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

  • Если результат найден в приведенном выше сопоставлении, клиент получит желаемое и остановит опрос.
  • Если в приведенном выше сопоставлении ничего не найдено, клиентпродолжает опрашивать в течение следующих 5 секунд.
  • Если найдена информация о сбое или опрашивается время ожидания, клиент сдается, прекращает опрос и отображает сообщение об ошибке.
1 голос
/ 12 июня 2019

Я бы предложил не использовать HTTP 102. Вы можете узнать больше о том, почему: https://softwareengineering.stackexchange.com/a/316211/79958

Я бы также STRONGLY рекомендовал против вашей текущей логики, используя параметр запроса. Кто-то может вводить команды, которые будут выполняться на сервере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...