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 解决了这个问题。
设置如下:我使用 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 解决了这个问题。