1

我试图弄清楚为什么我的应用程序的前端没有收到 Express 似乎认为它正在发送的文件。

该应用程序的预期行为是让用户在前端的 angular-powered 表单上单击“生成 PDF”按钮,然后让后端生成 PDF 并在完成创建后将其发送给用户。我可以确认 PDF 已成功生成,其他一切都按预期工作,但 res.sendFile 似乎无法在前端触发文件下载。

这是我用来触发下载的代码:

var labelStream = fs.createWriteStream('labels/' + transaction.object_id + '.pdf');

request(transaction.label_url).pipe(rawLabelStream);
rawLabelStream.on('finish', function () {
    var doc = new PDFDocument;
    doc.text(req.body.sku, 115, 315, {"width": "150", "align": "center"});
    doc.image('rawlabelpng/' + transaction.object_id + '.png', 325, 75, {"width": "250"});
    doc.moveDown();
    doc.text (req.body.note, 100, 645, {"align": "center"});
    doc.pipe(labelStream);
    doc.end();

    labelStream.on('finish', function () {
        console.log("PDF has been generated!");
        res.sendFile('/absPath/to/files/' + transaction.object_id + '.pdf', {"headers":{
            "content-type": "application/pdf",
            "content-disposition": "attachment"
        }}, function (err){
            if (err) {
                console.log(err);
                res.status(err.status).end();
            }
            else {
                console.log('Sent: ' + transaction.object_id + '.pdf');
            }
    });
});

当我测试上面的代码时,我在控制台中收到“Sent: xxxxxxxxx.pdf”日志,这表明没有明确的错误被触发。Express 似乎认为文件已成功发送,但下载从未在浏览器中触发。遗憾的是,使用 DEBUG=express:* 标志运行 nodemon 并没有为我提供任何有关 res.sendFile 正在做什么的额外信息。

早些时候,我遇到了关于绝对文件的 TypeError,所以我输入了从服务器根目录开始的文件的绝对路径。自那次更改以来,我没有看到 Express 出现任何错误,但它似乎仍然无法正常工作。我希望这是配置绝对路径的正确方法,我认为如果路径不正确并且实际上并没有导致文件,Express 会发送一个 ENOENT 错误......对吗?

有没有人遇到过这样的事情?

如果有帮助,我尝试将 res.sendFile 替换为 res.download 而行为没有改变。

4

0 回答 0