res.download() 在执行命令后抛出请求中止错误

res.download() throws request aborted error after executing command

我正在尝试创建一个包含一些 .txt 文件的存档,然后我想下载这个存档。请看下面的代码:

async function archiveAndDownload(res) {
    const bashCommand = ...
    const archive = ...

    exec(bashCommand, (err, stdout, stderr) => {
        if (err && err.code != 1) {
            console.log(err);
            res.status(500).json({ error: `Error.` });
            return;
        } else {
            if (stderr) {
                console.log(stderr);
            }
        }
    });

    res.status(200).download(archive, async (err) => {
        if (err) {
            console.log("Cannot download the archive " + err);
        } else {
            fs.unlink(archive);
        }
    });
}

async function getX(req, res) {
    try {
        await archiveAndDownload(res);  
    } catch (err) {
        console.log("Error: " + err);
    }   
}

尝试从 Postman 对其进行测试时,出现此错误:

Cannot download the archive Error: Request aborted

我该如何解决?感谢您的宝贵时间!

(附带说明,如果我尝试在 else 上将下载操作移动到 exec 中,它会起作用,但我想要有 2 个单独的代码块)

我想通了..

问题出在 getX 函数上。遗憾的是我忘记了最后有一个 finally 块总是执行..

所以整个 getX 函数是:

async function getX(req, res) {
    try {
        await archiveAndDownload(res);  
    } catch (err) {
        console.log("Error: " + err);
    } finally {
        res.end(); // <<<< this was my problem, I removed the whole finally block
    } 
}

很抱歉我没有在 post 中编写整个函数,但我终于想通了,这很好。希望这会对某人有所帮助。所以要小心:永远不要在 res.download 之后 res.renderres.sendres.end 等。您需要先让下载完成。