如何在Express中发送102处理?

时间:2019-06-12 13:06:24

标签: javascript node.js express

我正在设置一个新的HTTP服务器来执行一个长命令,并将该Shell命令的响应返回给客户端。

我运行Express的v4.17.1。运行此命令时,来自客户端的请求反复超时。 (如果有任何区别,我会使用app.use(cors())。

run(std::vector<Node> &data) {
    std::unordered_set<data::value_type> var;
}

当我尝试运行此命令时,浏览器只是超时,因为这只需要很长时间。如果我不能使用102处理,那我就需要另一种解决方案。谢谢!

2 个答案:

答案 0 :(得分:1)

我建议您不要使用HTTP102。您可以详细了解原因:https://softwareengineering.stackexchange.com/a/316211/79958

我也强烈建议使用查询参数针对您当前的逻辑。有人可以注入将在服务器上执行的命令。

答案 1 :(得分:1)

“如果我无法使用102处理...”

请勿使用102 Processing,因为它是专为WebDAV设计的。请检查RFC2518以获取详细信息。

“我想要另一个解决方案”

一旦收到HTTP请求并启动了子进程,您就可以为200 OK返回GET /dl,指示:“嘿,客户端,我已经收到您的请求并成功启动了作业”:

app.get("/dl", (req, res) => {
    require("child_process").exec("command -url".concat(req.query.url));
    res.status(200).end();
});

然后,在子进程中,将执行结果保存在某个位置(在文件中,在DB中等),并将结果映射到查询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秒(或您需要的任何时间间隔)向服务器发送请求,前一个成功查询网址为参数,尝试在上述映射中获取其结果。会是:

  • 如果在上述映射中找到结果,则客户端将获得所需的内容,并停止轮询。
  • 如果在上述映射中未找到任何内容,则客户端将在5秒钟后继续轮询。
  • 如果发现失败的信息,或者轮询超时,则客户端放弃,停止轮询,并显示错误消息。