我正在设置一个新的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/