Экспресс: res.sendFile не может инициировать загрузку файла, но без ошибок

Я пытаюсь понять, почему внешний интерфейс моего приложения не получает файл, который, по мнению Express, он отправляет.

Предполагаемое поведение приложения заключается в том, чтобы пользователь нажимал кнопку «создать 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');
            }
    });
});

Когда я тестирую приведенный выше код, я получаю журнал «Отправлено: xxxxxxxxx.pdf» в своей консоли, что предполагает отсутствие явной ошибки. Express считает, что файл успешно отправлен, но загрузка никогда не запускается в браузере. К сожалению, запуск nodemon с флагом DEBUG=express:* не дал мне никакой дополнительной информации о том, что делает res.sendFile.

Ранее я столкнулся с ошибкой TypeError об абсолютных файлах, поэтому я ввел абсолютный путь к файлу, начиная с корневого каталога сервера. После этого изменения я не видел никаких ошибок в Express, но, похоже, он все еще работает неправильно. Я надеюсь, что это правильный способ настроить абсолютный путь, и я думаю, что Express отправит ошибку ENOENT, если путь будет неверным и на самом деле не приведет к файлу... верно?

Кто-нибудь сталкивался с чем-то подобным раньше?

Если это поможет, я попытался заменить res.sendFile на res.download без каких-либо изменений в поведении.


person wingmatt    schedule 18.08.2016    source источник
comment
stackoverflow.com/questions/20508788/   -  person Ya Zhuang    schedule 18.08.2016
comment
Вы проверили права доступа к файлам и установили правильный заголовок?   -  person RIYAJ KHAN    schedule 18.08.2016
comment
@bitsMix Я только что попытался явно установить заголовки content-type и content-disposition в ответе, но, к сожалению, поведение не изменилось.   -  person wingmatt    schedule 18.08.2016
comment
Права доступа к файлам @R.J мне кажутся хорошими (правильный пользователь, с разрешениями на чтение), и явная установка заголовков содержимого не изменила поведение приложения.   -  person wingmatt    schedule 18.08.2016
comment
Вы случайно не ожидаете, что загрузка произойдет по запросу XHR? В этом случае вам понадобятся iframes или этот метод на вашем внешнем интерфейсе: stackoverflow.com/questions/17696516/   -  person Mihai Potra    schedule 19.08.2016
comment
@MihaiPotra Спасибо, что указали на это! Проведя еще несколько исследований метода Angular $http, я думаю, что это может быть основной проблемой - https://docs.angularjs.org/api/ng/service/%24http, что делает прямую загрузку файла, как я пытаюсь, невозможной, как вы сказали. Я проверю решения, на которые вы ссылаетесь, более подробно и попытаюсь ответить на этот вопрос сам, как только он заработает.   -  person wingmatt    schedule 19.08.2016