Я пытаюсь понять, почему внешний интерфейс моего приложения не получает файл, который, по мнению 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 без каких-либо изменений в поведении.