带管道的fs.createReadStream触发两次关闭事件

问题描述

我正在使用fs.createReadStream和npm软件包node-unzip-2将zip文件加载并解压缩到我的服务器上,然后我要使用将文件解压缩为可执行文件文件夹。但是,由于createReadStream是同步的和异步的,因此我遇到了事件问题。

我的上传代码如下:

    spacerace.post('/file-upload',upload.single('file'),function (request,response) {
    if (request.session.loggedin) {
        request.socket.setTimeout(10 * 60 * 1000);
        console.log('File is uploaded for: ' + request.session.teamID);
        var p = `bots/${request.session.teamID}`;
        deleteFolderRecursive(p);
        console.log('Folder deleted');
        fs.createReadStream(`uploads/${request.session.teamID}/${request.session.teamID}.zip`)
            .pipe(unzip.Extract({ path: `bots/${request.session.teamID}` }))
            .on('close',() => {
                console.log('File Unzipped');
                try {
                    var c = execSync(
                        path.join("server","exec.exe") + " -i " + request.session.teamID,{ timeout: 5000,stdio: "inherit" }

                    )
                }
                catch (ex) {
                    response.send("Cannot test file: " + ex).end();
                    console.log(ex);
                }
                console.log('File Tested');
                response.status(200).end();
            })
            .on('finish',() => { console.log("part1done"); });
    }
    else {
        response.redirect('./login');
    }
});

'close'事件被触发两次; createReadStream之后的文件读取了zip文件,而.pipe()完成后的文件读取了。

我还尝试在'finish'事件中设置execSync部分,但是在处理管道(因此解压缩)之前将其触发。

仅在完成.pipe()之后,如何才能在“关闭”事件中执行零件?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)