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 に置き換えてみましたが、動作は変わりません。