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

WebSocket connection closes after calling child process

设置如下:我使用 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命令执行命令行二进制文件。我从 stdout 解析完成的百分比,然后尝试将其发送给客户端。但是甚至在此之前,连接已经关闭,我不确定为什么:

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 函数成为一个承诺,然后等待它。我还尝试向 spawn 进程添加一个可选的 detached 选项。我不太确定为什么它会关闭,因为我也成功地将命令 k2pdfopt 替换为冗长的 find,并且效果很好(尽管它确实批处理了调用 ws.send).

之前的标准输出

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

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

我通过简单地从不同的终端安装节点包 live-server 和 运行 我的 index.html 解决了这个问题。