[英]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命令執行命令行二進制文件。 我解析從標准輸出中完成的百分比,然后嘗試將其發送給客戶端。 但是即使在此之前,連接也已經關閉,我不確定為什么:
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中的所有數據)。
感謝您提供任何有關其關閉原因的幫助或見解。
事實證明,當我創建一個子進程時,它正在重置運行index.html的Visual Studio Code活動服務器擴展。 這就解釋了為什么我也得到1001狀態代碼的原因,我發現這很可能意味着客戶端已刷新。
我通過簡單地安裝節點程序包live-server並從其他終端運行我的index.html來解決此問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.