调用子进程后,WebSocket连接关闭

时间:2018-10-11 16:49:11

标签: javascript websocket spawn

这里是设置:我使用ws库创建简单的WebSocket服务器。然后,当客户端向我发送要转换的PDF的URL时,我将附加一个侦听器。我在本地下载它,然后调用另一个命令对其进行转换:

const download = require("download");
wss.on("connection", ws => {
  ws.onmessage = async msg => {
    await download(msg.data, destination, {
      filename: fileName
    });

    transformPDF(ws, msg.data);
  };

  // ...
});

此后,transformPDF函数调用spawn命令以执行命令行二进制文件。我解析从标准输出中完成的百分比,然后尝试将其发送给客户端。但即使在此之前,连接已关闭,我不确定为什么:

const { spawn } = require("child_process");
const transformPDF = (ws, url) => {
  // ...
  const child = spawn("k2pdfopt", settings);

  child.stdout.on("data", data => {
    // ...
    ws.send(percentageDone); // <--- connection is broken before this is called
  });
};

我试图使transformPDF函数成为一个承诺,然后等待它。我还尝试过在生成过程中添加可选的detached选项。我不太确定为什么要关闭它,因为我也成功地将命令k2pdfopt替换为一个冗长的find之类的命令,并且效果很好(尽管它确实批量处理了调用ws.send之前先输入stdout。

非常感谢您提供任何有关其关闭原因的帮助或见解。

1 个答案:

答案 0 :(得分:0)

事实证明,当我创建子进程时,它正在重置运行index.html的Visual Studio Code实时服务器扩展。这就解释了为什么我还得到1001状态代码的原因,我发现这很可能意味着客户端已刷新。

我通过简单地安装节点程序包live-server并从另一个终端运行我的index.html来解决此问题。