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

我运行Express v4.17.1。运行此命令时,来自客户端的请求已反复超时。 (如果有任何区别,我会使用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处理,那只是我想要另一个解决方案。谢谢!

最佳答案

“如果我不能使用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秒钟后继续轮询。
如果找到失败的信息,或者轮询超时,则客户端放弃,停止轮询,并显示错误消息。

关于javascript - 如何在Express中发送102处理?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56562975/

10-12 16:17